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.
4 Antworten
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
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;
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
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
Neue Fragen
mysql
MySQL ist ein kostenloses Open-Source-RDBMS (Relational Database Management System), das SQL (Structured Query Language) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle ihre eigenen SQL-Dialekte verwenden, um die Daten zu verwalten.