CASE ใน ORDER BY และการรวมค่า
การเรียงลำดับและนับแบบมีเงื่อนไข
CASE ใน ORDER BY และการรวมค่า เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเรียงลำดับด้วยความสำคัญแบบกำหนดเอง
โดยปกติส่วนคำสั่ง ORDER BY ของเอสคิวแอลจะเรียงแถวตามค่าตามธรรมชาติของคอลัมน์ แต่คุณสามารถฝังนิพจน์ CASE ไว้ใน ORDER BY เพื่อสร้างลำดับการเรียงแบบกำหนดเองได้ทั้งหมด ซึ่งเป็นลำดับที่คอลัมน์ใดคอลัมน์หนึ่งไม่สามารถสร้างได้ด้วยตัวเอง
เทคนิคนี้มีประโยชน์เมื่อกฎทางธุรกิจเป็นตัวกำหนดลำดับความสำคัญ แทนที่จะใช้ค่าดิบของข้อมูล
SELECT product_name, status
FROM products
ORDER BY
CASE status
WHEN 'urgent' THEN 1
WHEN 'active' THEN 2
WHEN 'pending' THEN 3
ELSE 4
END;การทำงานของ CASE ภายใน ORDER BY
เมื่อฐานข้อมูลประเมิน ORDER BY CASE ... END ระบบจะคำนวณจำนวนเต็มหรือค่าอื่นที่สามารถเปรียบเทียบได้สำหรับแต่ละแถว จากนั้นจึงเรียงแถวตามค่าที่คำนวณได้นี้ แทนที่จะเรียงตามคอลัมน์ดิบ หรือเรียงเพิ่มเติมจากคอลัมน์ดิบ
นิพจน์ CASE จะไม่ถูกจัดเก็บ แต่มีอยู่เฉพาะในช่วงเวลาที่คำสั่งสอบถามทำงานเท่านั้น
SELECT order_id, priority
FROM orders
ORDER BY
CASE priority
WHEN 'high' THEN 1
WHEN 'medium' THEN 2
WHEN 'low' THEN 3
ELSE 9
END,
order_id;การเรียง NULL อย่างชัดเจน
โดยค่าเริ่มต้น ฐานข้อมูลแต่ละชนิดจะวาง NULL ไว้ที่ต้นหรือท้ายผลลัพธ์ที่เรียงแล้วแตกต่างกัน การใช้ CASE ใน ORDER BY ช่วยให้คุณกำหนดได้อย่างแน่นอนว่า NULL จะอยู่ที่ใด โดยไม่ขึ้นกับกลไกฐานข้อมูล
SELECT employee_name, manager_id
FROM employees
ORDER BY
CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
manager_id;การเรียงจากน้อยไปมากและจากมากไปน้อยแบบมีเงื่อนไข
CASE ใน ORDER BY ยังเลียนแบบทิศทางแบบมีเงื่อนไขได้ด้วย การจับคู่ค่าหมวดหมู่กับจำนวนติดลบช่วยให้คุณกลับลำดับการเรียงสำหรับบางกลุ่มได้อย่างมีประสิทธิภาพ ขณะที่กลุ่มอื่นยังคงใช้ลำดับปกติ
วิธีนี้มีประโยชน์เมื่อชนิดของแถวที่แตกต่างกันต้องใช้ตรรกะการเรียงที่ต่างกันภายในชุดผลลัพธ์เดียว
SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
due_date;CASE ภายใน COUNT
คุณสามารถฝังนิพจน์ CASE ไว้ในฟังก์ชันรวม เช่น COUNT ได้ เคล็ดลับคือส่งคืนค่าที่ไม่ใช่ NULL สำหรับแถวที่ต้องการนับ และส่งคืน NULL สำหรับแถวที่ต้องการข้าม เพราะ COUNT จะไม่นับค่า NULL
SELECT
COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count,
COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;CASE ภายใน SUM — ยอดรวมแบบมีเงื่อนไข
การวาง CASE ไว้ภายใน SUM ช่วยให้คุณรวมค่าเฉพาะเมื่อเงื่อนไขเป็นจริง และถือว่าแถวที่ไม่ตรงกันมีค่าเป็นศูนย์ รูปแบบนี้พบได้บ่อยมากในรายงานแบบตารางไขว้ที่แยกคอลัมน์เดียวออกเป็นคอลัมน์ตัวชี้วัดหลายคอลัมน์
SELECT
SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
SUM(CASE WHEN region = 'East' THEN sales_amount ELSE 0 END) AS east_total
FROM sales;AVG แบบมีเงื่อนไขด้วย CASE
รูปแบบเดียวกันใช้กับ AVG ได้ เนื่องจาก AVG ไม่นำค่า NULL มาคำนวณ การส่งคืน NULL สำหรับแถวที่ต้องการตัดออกจะทำให้ได้ค่าเฉลี่ยของเฉพาะแถวที่ตรงกัน โดยไม่ต้องใช้แบบสอบถามย่อย
SELECT
AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
AVG(CASE WHEN department = 'Marketing' THEN salary END) AS avg_mkt_salary
FROM employees;การจัดกลุ่มด้วย CASE — การแบ่งแถวเป็นกลุ่ม
คุณสามารถใช้ CASE ในรายการ GROUP BY หรือ SELECT เพื่อแบ่งค่าต่อเนื่องเป็นหมวดหมู่ แล้วจึงรวมข้อมูลของแต่ละกลุ่ม วิธีนี้เปลี่ยนคอลัมน์ตัวเลขให้เป็นกลุ่มที่มีป้ายกำกับโดยไม่แก้ไขข้อมูลพื้นฐาน
SELECT
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 35 THEN '18-35'
WHEN age BETWEEN 36 AND 55 THEN '36-55'
ELSE '56+'
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 35 THEN '18-35'
WHEN age BETWEEN 36 AND 55 THEN '36-55'
ELSE '56+'
END;การใช้ชื่อแทนเทียบกับการเขียน CASE ซ้ำ
การเขียนนิพจน์ CASE ยาว ๆ ซ้ำทั้งใน SELECT และ GROUP BY ทำให้โค้ดดูยืดยาว ฐานข้อมูลบางชนิด (MySQL, PostgreSQL เมื่อใช้วิธีแก้ไขเพิ่มเติม) อนุญาตให้อ้างอิงชื่อแทนใน ORDER BY ได้ แต่ไม่อนุญาตใน GROUP BY วิธีที่ปลอดภัยและใช้ได้กับฐานข้อมูลหลากหลายที่สุดคือครอบคำสั่งสอบถามไว้ในแบบสอบถามย่อยหรือ CTE แล้วใช้ GROUP BY กับชื่อแทนจากที่นั่น
WITH scored AS (
SELECT
customer_id,
CASE
WHEN total_spent >= 1000 THEN 'Gold'
WHEN total_spent >= 500 THEN 'Silver'
ELSE 'Bronze'
END AS tier
FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
CASE tier
WHEN 'Gold' THEN 1
WHEN 'Silver' THEN 2
ELSE 3
END;การรวม ORDER BY CASE กับ ASC / DESC
หลังนิพจน์ CASE คุณยังสามารถต่อท้ายด้วย ASC หรือ DESC และเพิ่มคอลัมน์สำหรับเรียงลำดับได้ โดยคั่นด้วยจุลภาค คะแนนจาก CASE เป็นเพียงเกณฑ์การเรียงลำดับแรก ส่วนคอลัมน์ถัดไปจะใช้ตัดสินกรณีค่าซ้ำตามปกติ
SELECT
ticket_id,
category,
created_at
FROM support_tickets
ORDER BY
CASE category
WHEN 'billing' THEN 1
WHEN 'outage' THEN 2
WHEN 'feature' THEN 3
ELSE 4
END ASC,
created_at ASC;ตัวอย่างจากการใช้งานจริง — แผงสรุปยอดขาย
ต่อไปนี้คือตัวอย่างคิวรีที่สมจริง ซึ่งรวมการรวมค่าโดยใช้ CASE เข้ากับการเรียงลำดับโดยใช้ CASE คิวรีนี้สร้างสรุปยอดขายแยกตามภูมิภาค โดยเรียงลำดับให้ภูมิภาคที่มีรายได้สูงสุดปรากฏก่อนเสมอ และเลื่อน “อื่น ๆ” ไปไว้ท้ายสุด
SELECT
CASE
WHEN region IN ('North', 'South', 'East', 'West') THEN region
ELSE 'Other'
END AS region_label,
SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
COUNT(CASE WHEN status = 'refunded' THEN 1 END) AS refund_count
FROM orders
GROUP BY
CASE
WHEN region IN ('North', 'South', 'East', 'West') THEN region
ELSE 'Other'
END
ORDER BY completed_sales DESC;ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการใช้ CASE ภายใน ORDER BY และฟังก์ชันการรวมค่า
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้วิธีใช้ CASE ร่วมกับ ORDER BY และฟังก์ชันการรวมค่า:
- CASE in ORDER BY — กำหนดคะแนนการเรียงลำดับแบบกำหนดเองให้แถว ควบคุมตำแหน่งที่ NULL ปรากฏ และผสมกฎการเรียงลำดับหลายข้อไว้ในคิวรีเดียว
- CASE in COUNT — คืนค่าที่ไม่ใช่ NULL สำหรับแถวที่ต้องการนับ และคืนค่า NULL (โดยนัยหรืออย่างชัดเจน) สำหรับแถวที่ต้องข้าม
- CASE in SUM / AVG — ใช้ 0 หรือ NULL เป็นค่า ELSE เพื่อสร้างผลรวมและค่าเฉลี่ยแบบมีเงื่อนไขได้ในการประมวลผลรอบเดียว
- CASE in GROUP BY — จัดกลุ่มค่าต่อเนื่องหรือค่าที่แบ่งเป็นหมวดหมู่ลงในกลุ่มที่มีป้ายกำกับเพื่อการรวมค่า
รูปแบบเหล่านี้ช่วยลดความจำเป็นในการใช้คิวรีย่อยจำนวนมาก และทำให้การเขียนรายงานรูปแบบตารางไขว้ด้วย SQL แบบตรงไปตรงมาเป็นเรื่องง่าย
เรียนรู้ SQL ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 46
- บทเรียน
- 183
คำถามที่พบบ่อย
บทเรียน “CASE ใน ORDER BY และการรวมค่า” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “CASE ใน ORDER BY และการรวมค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “CASE ใน ORDER BY และการรวมค่า”
การเรียงลำดับและนับแบบมีเงื่อนไข คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “CASE ใน ORDER BY และการรวมค่า” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- นิพจน์ CASE
- CASE แบบค้นหาเทียบกับแบบง่าย
- การจัดกลุ่มช่วงและติดป้ายข้อมูล
- CASE ใน ORDER BY และการรวมค่า