SQL Academy · บทเรียน

CASE ใน ORDER BY และการรวมค่า

การเรียงลำดับและนับแบบมีเงื่อนไข

บทเรียน 4 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. นิพจน์ CASE
  2. CASE แบบค้นหาเทียบกับแบบง่าย
  3. การจัดกลุ่มช่วงและติดป้ายข้อมูล
  4. CASE ใน ORDER BY และการรวมค่า
← กลับไปที่ SQL Academy