ดูโครงสร้างตารางกันก่อนมีตาราง 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.