Skip to content

Lab: Business Questions

ตาราง students มีข้อมูลดังนี้:

student_idnameemailpriceenrolled_onactive
STD001สมชายsomchai@mail.com4500.002025-03-15TRUE
STD002สมหญิงsomying@mail.com3200.002025-06-01TRUE
STD003วิชัยwichai@mail.com7800.002024-11-20FALSE
STD004มานีmanee@mail.com4500.002025-01-10TRUE
STD005กมลNULL2100.002025-08-22FALSE
STD006ปรีชาpreecha@mail.com9500.002024-09-05TRUE

โจทย์: ตอบคำถามจาก Business Team

Section titled “โจทย์: ตอบคำถามจาก Business Team”
  1. “มีนักเรียนทั้งหมดกี่คน? กี่คนที่ active? กี่คนที่ inactive?”

    Show Solution
    SELECT COUNT(*) AS total_students,
    COUNT(*) FILTER (WHERE active) AS active_count,
    COUNT(*) FILTER (WHERE NOT active) AS inactive_count
    FROM students;

    ผลลัพธ์: total = 6, active = 4, inactive = 2

    วิธีทางเลือก (ถ้า database ไม่รองรับ FILTER):

    SELECT COUNT(*) AS total_students,
    SUM(CASE WHEN active THEN 1 ELSE 0 END) AS active_count,
    SUM(CASE WHEN NOT active THEN 1 ELSE 0 END) AS inactive_count
    FROM students;
  2. “รายได้รวมจากค่าเรียนเท่าไหร่? เฉพาะนักเรียนที่ยัง active ล่ะ?”

    Show Solution
    SELECT SUM(price) AS total_revenue,
    SUM(CASE WHEN active THEN price ELSE 0 END) AS active_revenue
    FROM students;

    ผลลัพธ์: total = 31600.00, active = 21700.00

  3. “แต่ละไตรมาสของปี 2025 มีคนสมัครกี่คน? รายได้เท่าไหร่?”

    Show Solution
    SELECT EXTRACT(QUARTER FROM enrolled_on) AS quarter,
    COUNT(*) AS signups,
    SUM(price) AS revenue
    FROM students
    WHERE enrolled_on >= '2025-01-01'
    AND enrolled_on < '2026-01-01'
    GROUP BY EXTRACT(QUARTER FROM enrolled_on)
    ORDER BY quarter;

    ผลลัพธ์:

    quartersignupsrevenue
    128700.00
    213200.00
    312100.00
  4. “มีนักเรียนกี่คนที่ไม่มีอีเมล? คิดเป็นกี่เปอร์เซ็นต์?”

    Show Solution
    SELECT COUNT(*) - COUNT(email) AS missing_email,
    ROUND(
    (COUNT(*) - COUNT(email))::NUMERIC / COUNT(*) * 100, 1
    ) AS missing_pct
    FROM students;

    ผลลัพธ์: missing_email = 1, missing_pct = 16.7%

  5. “แสดงเฉพาะกลุ่ม active/inactive ที่ค่าเรียนเฉลี่ยมากกว่า 4000 บาท เรียงจากเฉลี่ยสูงสุด”

    Show Solution
    SELECT active,
    COUNT(*) AS num_students,
    AVG(price) AS avg_price,
    MIN(price) AS min_price,
    MAX(price) AS max_price
    FROM students
    GROUP BY active
    HAVING AVG(price) > 4000
    ORDER BY avg_price DESC;

    ผลลัพธ์:

    activenum_studentsavg_pricemin_pricemax_price
    TRUE45425.003200.009500.00
    FALSE24950.002100.007800.00

    ทั้งสองกลุ่มมีค่าเฉลี่ยเกิน 4000 จึงแสดงทั้งคู่