Ich habe 2 Abfragen, die ich verwendet habe, um die Summe der Werte basierend auf dem Flag-Wert abzurufen

SELECT SUM(stock_deliveries.stockValue) AS stockValues1
FROM `stock_deliveries`
LEFT JOIN `delivery` ON `delivery`.`pk_deliveryId`  = `stock_deliveries`.`fk_deliveryId`
WHERE `stock_deliveries`.`fk_stockID` = '189'
AND `delivery`.`delivery_completed` = '1'

SELECT SUM(stock_deliveries.stockValue) AS stockValues2
FROM `stock_deliveries`
LEFT JOIN `delivery` ON `delivery`.`pk_deliveryId`  = `stock_deliveries`.`fk_deliveryId`
WHERE `stock_deliveries`.`fk_stockID` = '189'
AND `delivery`.`delivery_completed` = '0

Ist es möglich, diese 2 Abfragen in einer einzigen Abfrage zusammenzuführen? Danke im Voraus.

0
ManoharSingh 18 Apr. 2018 im 13:00

4 Antworten

Beste Antwort

Sie können eine einzelne Abfrage mithilfe von GROUP BY verwenden

SELECT SUM(stock_deliveries.stockValue) AS stockValues, `delivery`.`delivery_completed` as deliveryCompleted
FROM `stock_deliveries`
LEFT JOIN `delivery` ON `delivery`.`pk_deliveryId` =  `stock_deliveries`.`fk_deliveryId`
WHERE `stock_deliveries`.`fk_stockID` = '189'
GROUP BY `delivery`.`delivery_completed`;

Dabei erhalten Sie für jeden Wert von delivery_completed eine Zeile mit der zugehörigen Summe (wenn Sie nur 0 und 1 Werte benötigen, können Sie die where-Klausel and delivery.delivery_completed IN (0,1) hinzufügen). Beispiel:

stockValues    deliveryCompleted
       1000           0
        700           1
1
lyisia 18 Apr. 2018 im 10:23

Ja, Sie würden eine bedingte Aggregation verwenden (d. H. CASE WHEN innerhalb einer Aggregationsfunktion wie SUM):

select
  sum(case when d.delivery_completed = 0 then sd.stockvalue end) as stockvalues0,
  sum(case when d.delivery_completed = 1 then sd.stockvalue end) as stockvalues1
from stock_deliveries sd
left join delivery d on d.pk_deliveryid = sd.fk_deliveryid
where sd.fk_stockid = 189;
2
Thorsten Kettner 18 Apr. 2018 im 10:04

Sie können "if" in der Summe verwenden, um zu überprüfen, ob Sie den Wert in stockValues1 oder stockValues0 benötigen.

SELECT SUM(IF(d.delivery_completed = 1, sd.stockValue, 0)) AS stockValues1, SUM(IF(d.delivery_completed = 0, sd.stockValue, 0)) AS stockValues2
FROM stock_deliveries sd
LEFT JOIN delivery d ON d.pk_deliveryId  = sd.fk_deliveryId
WHERE sd.fk_stockID = '189'
AND (d.delivery_completed = 1 OR d.delivery_completed = 0)

Wenn "Delivery_completed" nur 1 oder 0 ist, können Sie natürlich das letzte AND in der Abfrage weglassen.

Bearbeiten: Wie Thorsten Kettner antwortete, können Sie auch die Case-When-Syntax verwenden, wobei nur ein "Fall" im Wesentlichen gleichwertig ist. Die if -Syntax ist in diesem Fall präziser, aber wenn Sie mehr Optionen haben, ist sie flexibler, zum Beispiel:

SELECT CASE sometable 
       WHEN 'top' THEN 'high' 
       WHEN 'center' THEN 'medium' 
       ELSE 'low' 
       END AS position
0
Roberto Bisello 18 Apr. 2018 im 10:17

Sie können den Operator UNION ALL verwenden, um die Logik von 2 Ergebniszeilen beizubehalten, aber diese befinden sich jetzt im selben Ergebnis anstatt in zwei getrennten

0
Kobi 18 Apr. 2018 im 10:18