Tampilkan nilai di kolom meskipun dikecualikan oleh kondisi WHERE di kolom lain
DB-Fiddle
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");
Hasil yang diharapkan:
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
Pada hasil di atas saya ingin membuat daftar semua itemID
dan orderID
yang memiliki shipped_volume > 0
.
Oleh karena itu, saya pergi dengan pertanyaan ini:
SELECT
itemID,
orderID,
sum(order_volume),
sum(shipped_volume)
FROM operations
WHERE shipped_volume > 0
GROUP BY 1,2;
Ini memberi saya hampir hasil yang saya cari.
Satu-satunya masalah yang saya miliki adalah menempatkan a 0
untuk semua baris di kolom sum(order_volume)
yang disebabkan oleh WHERE
kondisi tersebut.
Apa yang perlu saya ubah sehingga ini juga menampilkan sum(order_volume)
dari semua items
dan orders
yang memiliki shipped_volume > 0
?
Jawaban
Ini mungkin yang Anda cari jika saya mengerti dengan benar:
SELECT
itemID,
orderID,
sum(order_volume),
sum(shipped_volume)
FROM operations
GROUP BY 1,2
HAVING sum(shipped_volume) > 0;
TEMUKAN DEMO DI SINI
Cukup kami HAVING
alih-alih di mana, contoh ini adalah contoh sempurna tentang cara menggunakan HAVING
, anggap saja menerapkan filter SETELAH menghitung hasil grup!
SELECT
itemID,
orderID,
SUM(order_volume),
SUM(shipped_volume)
FROM operations
GROUP BY itemID, orderID
HAVING SUM(shipped_volume) > 0;
Biola Anda diperbarui
Lebih banyak bacaan HAVING
khusus untuk MySQL:https://www.mysqltutorial.org/mysql-having.aspx
CATATAN: Dalam contoh ini saya telah menggunakan referensi nama kolom eksplisit daripada ordinal, ada banyak argumen pendukung untuk ini, saya pergi dengan "itu lebih ekspresif dan lebih sulit untuk salah".
- Tata cara dalam
GROUP BY
tidak didukung di semua mesin atau versi db. - https://stackoverflow.com/a/45569726/1690217