ปัญหาของ Group by

ดูโครงสร้างตารางกันก่อนมีตาราง CONSISTS (เก็บข้อมูลการสั่งไอศครีม แต่ละถ้วย) กับ STOCKS (เก็บข้อมูลของสินค้า)

ลองสร้างโจทย์เล่นๆ กัน คือ หายอดขายของไอศครีม แต่ละชิ้นว่ามีการสั่งไปจำนวนกี่ครั้ง โดยจะต้องแสดงไอศครีมที่ยังไม่ได้ถูกสั่งด้วย

  • มาดูโจทย์ทีละส่วน หายอดขายของไอศครีม แต่ละชิ้นว่ามีการสั่งไปจำนวนกี่ครั้ง แสดงว่าต้องมีการ join ตาราง CONSISTS กับ STOCKS เพื่อให้ได้ข้อมูลของไอศครีมแต่ละชนิดออกมา โดยจะใช้ RIGHT OUTER JOIN เพื่อให้ได้ข้อมูลไอศครีมที่ไม่ถูกสั่งออกมา ซึ่งจะเป็นค่า NULL
  • จะต้องแสดงไอศครีมที่ยังไม่ได้ถูกสั่งด้วย มันจะได้เป็นค่า null โดยเราจะใช้ฟังค์ชั่น NVL ของ Oracle ในการเปลี่ยน NULL เป็น 0 
    • วิธีการใช้ NVL(ชื่อคอลัมน์ , ตัวเลขที่จะให้เปลี่ยน)

SQL แบบแรกที่ลองเขียนขึ้น

SELECT C.stock_id, 
       Nvl(Count(C.stock_id), 0) 
FROM   consists C 
       right outer join stocks S 
          ON ( C.stock_id = S.stock_id ) 
WHERE  S.stock_type = 1 
GROUP  BY C.stock_id 
ORDER  BY Count(C.stock_id) DESC;

แต่ข้อมูลไอศครีม (STOCK_TYPE = 1) มีทั้งหมด 19 ชนิด แสดงว่ามันตกหล่นไป 5 อย่าง

SELECT * 
FROM   stocks 
WHERE  stock_type = 1;

เมื่อเราลองเปลี่ยน Alias ใน SQL มัน GROUP BY จาก C.STOCK_ID เป็น S.STOCK_ID แล้วผลที่ได้ คือ มีทั้งหมด 19 แถวออกมา (เลือกตัวที่จะ GROUP BY ผิดทีนี่ยาวเลย)

SELECT S.stock_id, 
       Nvl(Count(C.stock_id), 0) 
FROM   consists C 
       right outer join stocks S 
          ON ( C.stock_id = S.stock_id ) 
WHERE  S.stock_type = 1 
GROUP  BY S.stock_id 
ORDER  BY Count(C.stock_id) DESC;

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.