SELECT ซ้อน SELECT (GROUP BY, HAVING, SUBQuery, COUNT)

โดย SONGCHAI SAETERN
เมื่อต้องการนับจำนวนรายการตามเงื่อนไข แต่ก็จำเป็นต้องใช้ GROUP BY เพราะการใช้ COUNT + DISTINCT ไม่สามารถดึงข้อมูลตามเงื่อนไขได้



 อยากจะนับจำนวนสมาชิกที่ชำระเงิน

ถ้าใช้ COUNT() ก็จะออกมาหมด ทำให้ได้จำนวนเกินจากความเป็นจริง เพราะสมาชิกบางคนชำระมากกว่า 1 ครั้ง





ก็เลยต้องเอามา GROUP กันด้วย รหัสสมาชิกก่อน เพื่อตัดเรคอร์ดที่ซ้ำกันออกไป สมาชิกจะชำระกี่ครั้ง ก็นับเป็น 1 คน (เพราะเป็นสมาชิกคนเดียวกัน)


จะเห็นว่า จะได้ยอดที่ถูกต้อง 139


แต่ข้อมูลมันแจกแจงรายการต้อง 139 แถว ซึ่งเราไม่ได้อยากได้รายละเอียด แค่อยากนับจำนวนเท่านั้นจะทำไงล่ะทีนี้



ก็จัดการ SELECT ครอบ SELECT ไว้เลย ซึ่งก็คือการทำ SubQuery นั่นเอง

ก็จะออกมาเรคอร์ดเดียว เป็นจำนวนที่ต้องการนำไปใช้งานได้ทันที



จริงๆแล้วเราใช้ DISTINCT ได้นะ ถ้าเงื่อนไขมีแค่เท่านี้ ไม่จำเป็นต้อง SubQuery

ดูสิ พอนับแบบตัดรายการซ้ำกันออกก็ได้
139 พอดิบพอดีเลย

ใช่ครับ ถ้าเงื่อนไขมีเพียงเท่านี้ก็ใช้ได้เลย
แต่ถ้ามีเงื่อนไขอื่นล่ะ???




ถ้าจะนับเฉพาะสมาชิกที่ชำระเงินตั้งแต่ 1500 บาทขึ้นไปเท่านั้นล่ะ?

ค่าที่ได้มาก็มีโอกาสผิดเพี้ยนนะ เพราะบางคนก็ชำระหลายครั้ง แต่พอรวมกันก็ถึง 1500 บาทเหมือนกันนะ

ตัวอย่างนี้ได้แค่ 61 แต่จริงๆแล้ว มี 64 คนเลยนะ!





กลับไปที่การ GROUP BY กันต่อ

เราสามารถใช้เงื่อนไข SUM ใน HAVING ได้นะ คือหลังจากเอามา GROUP กันแล้ว บางคนที่ชำระ 3 ครั้ง ก็จะ SUM รวมเป็นยอดเดียว ก็มีโอกาสถึง 1500 บาท อีกตั้ง 3 คนแน่ะ >O<

ผลลัพธ์ที่ได้คือ 64 คน คือคำตอบที่ต้องการ
แต่ทีนี้ผลลัพธ์ที่ได้มันแจกแจงรายการไง กลายเป็น 64 เรคอร์ด ถ้าอยากได้แค่จำนวนก็ต้อง SubQuery แบบเดิมอีกครั้ง







พอเขียน SELECT ครอบเข้าไป

เราก็จะได้ผลลัพธ์ 64 ออกมาเรคอร์ดเดียวไว้ใช้งานแล้วล่ะ ^O^



โค้ด SQL

SELECT

    COUNT(*) AS total
FROM (
    SELECT
        COUNT(*)
    FROM
        tb_payment
    GROUP BY
        member_id
    HAVING
        SUM(amount_pay) > 1500
) AS tb_count





PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
http://fastcoding.phpcodemania.com/index.php/#purchase-order
ราคาสุดคุ้ม
http://fastcoding.phpcodemania.com