แสดงค่าในคอลัมน์แม้ว่าจะถูกยกเว้นโดยเงื่อนไข WHERE เหนือคอลัมน์อื่น

Aug 20 2020

DB- ซอ

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");

ผลลัพธ์ที่คาดหวัง:

    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

ผลดังกล่าวข้างต้นผมต้องการที่จะแสดงรายการทั้งหมดitemIDและที่มีorderID ดังนั้นฉันจึงใช้คำถามนี้:shipped_volume > 0

SELECT 
itemID,
orderID,
sum(order_volume),
sum(shipped_volume)
FROM operations
WHERE shipped_volume > 0
GROUP BY 1,2;

มันทำให้ฉันเกือบจะได้ผลลัพธ์ที่ฉันกำลังมองหา
ปัญหาเดียวที่ฉันมีคือทำให้0แถวทั้งหมดในคอลัมน์sum(order_volume)ซึ่งเกิดจากWHEREเงื่อนไข

ฉันต้องเปลี่ยนอะไรจึงจะแสดงsum(order_volume)ข้อมูลทั้งหมดitemsและordersที่มีshipped_volume > 0?

คำตอบ

Gosfly Aug 20 2020 at 16:55

นี่อาจเป็นสิ่งที่คุณกำลังมองหาหากฉันเข้าใจถูกต้อง:

SELECT 
  itemID,
  orderID,
  sum(order_volume),
  sum(shipped_volume)
FROM operations
GROUP BY 1,2
HAVING sum(shipped_volume) > 0;

ค้นหาการสาธิตที่นี่

1 ChrisSchaller Aug 20 2020 at 16:54

เพียงแค่เราHAVINGแทนที่จะอยู่ที่ไหนตัวอย่างนี้เป็นตัวอย่างที่สมบูรณ์แบบของวิธีการใช้HAVINGคิดว่ามันเป็นการใช้ตัวกรองหลังจากคำนวณผลลัพธ์ของกลุ่ม!

SELECT 
  itemID,
  orderID,
  SUM(order_volume),
  SUM(shipped_volume)
FROM operations
GROUP BY itemID, orderID
HAVING SUM(shipped_volume) > 0;

อัปเดตซอของคุณแล้ว

อ่านเพิ่มเติมเกี่ยวHAVINGกับ MySQL โดยเฉพาะ:https://www.mysqltutorial.org/mysql-having.aspx

หมายเหตุ:ในตัวอย่างนี้ฉันได้ใช้การอ้างอิงชื่อคอลัมน์ที่ชัดเจนแทนการจัดลำดับมีข้อโต้แย้งสนับสนุนมากมายสำหรับสิ่งนี้ฉันใช้ "มันแสดงออกมากกว่าและเข้าใจผิดยากกว่า"

  • GROUP BYไม่รองรับออร์เทอร์นอลในเอนจิ้นdb หรือเวอร์ชันทั้งหมด
  • https://stackoverflow.com/a/45569726/1690217