Visualizza il valore nella colonna anche se è escluso da una condizione WHERE su un'altra colonna
DB-Violino
CREATE TABLE operations (
id int auto_increment primary key,
orderID VARCHAR(255),
itemID VARCHAR(255),
event_date DATE,
order_volume INT,
shipped_volume INT
);
INSERT INTO operations
(itemID, orderID, event_date, order_volume, shipped_volume
)
VALUES
("Item_01", "Order_XYZ", "2020-05-01", "600", "0"),
("Item_01", "Order_XYZ", "2020-05-18", "0", "315"),
("Item_01", "Order_XYZ", "2020-05-19", "0", "100"),
("Item_01", "Order_MTE", "2020-08-15", "400", "0"),
("Item_01", "Order_OBD", "2020-08-21", "500", "0"),
("Item_01", "Order_OBD", "2020-11-17", "0", "380"),
("Item_02", "Order_TLP", "2020-02-02", "500", "0"),
("Item_02", "Order_TLP", "2020-02-10", "0", "175"),
("Item_02", "Order_ADF", "2020-03-27", "100", "0"),
("Item_03", "Order_BBI", "2020-03-12", "700", "0"),
("Item_04", "Order_DXR", "2020-12-09", "260", "0"),
("Item_04", "Order_DXR", "2020-12-15", "0", "110"),
("Item_04", "Order_DXR", "2020-12-15", "0", "60"),
("Item_04", "Order_FGU", "2020-12-15", "0", "80");
Risultato atteso:
itemID | orderID | sum(order_volume) | sum(shipped_volume)
--------------|---------------|--------------------------|---------------------------------------
Item_04 | Order_DXR | 260 | 250
Item_02 | Order_TLP | 500 | 175
Item_01 | Order_XYZ | 600 | 415
Item_01 | Order_OBD | 500 | 380
Nel risultato sopra voglio elencare tutto itemID
e orderID
che hanno shipped_volume > 0
.
Pertanto, sono andato con questa domanda:
SELECT
itemID,
orderID,
sum(order_volume),
sum(shipped_volume)
FROM operations
WHERE shipped_volume > 0
GROUP BY 1,2;
Mi dà quasi il risultato che sto cercando.
L'unico problema che ho è che mette a 0
per tutte le righe nella colonna sum(order_volume)
che è causata dalla WHERE
condizione.
Cosa devo cambiare in modo che visualizzi anche il sum(order_volume)
di tutti items
e orders
che abbia un shipped_volume > 0
?
Risposte
Questo potrebbe essere quello che stai cercando se ho capito bene:
SELECT
itemID,
orderID,
sum(order_volume),
sum(shipped_volume)
FROM operations
GROUP BY 1,2
HAVING sum(shipped_volume) > 0;
TROVA UNA DEMO QUI
Semplicemente noi HAVING
invece di dove, questo esempio è l'esempio perfetto di come usare HAVING
, pensalo come applicare il filtro DOPO aver calcolato i risultati del gruppo!
SELECT
itemID,
orderID,
SUM(order_volume),
SUM(shipped_volume)
FROM operations
GROUP BY itemID, orderID
HAVING SUM(shipped_volume) > 0;
Il tuo violino aggiornato
Ulteriori letture HAVING
specifiche per MySQL:https://www.mysqltutorial.org/mysql-having.aspx
NOTA: in questo esempio ho usato riferimenti espliciti al nome di colonna invece di ordinali, ci sono molti argomenti a sostegno di questo, vado con "è più espressivo e più difficile sbagliare".
- Gli ordinali in
GROUP BY
non sono supportati in tutti i motori o versioni di database. - https://stackoverflow.com/a/45569726/1690217