0Pricing
SQL Academy · บทเรียน

นิพจน์ CASE และคำค้นแบบ Pivot

ใช้ CASE WHEN ภายในฟังก์ชันรวม เพื่อแปลงตารางแนวตั้งเป็นรายงานตารางไขว้แนวนอน

นิพจน์ CASE และคำค้นแบบ Pivot เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

CASE: If/Else แบบแทรกใน SQL

CASE คือการเขียนเงื่อนไขสามทางของ SQL มีสองรูปแบบ:

-- Searched CASE
CASE WHEN x > 0 THEN 'positive'
     WHEN x < 0 THEN 'negative'
     ELSE 'zero' END

-- Simple CASE
CASE status
  WHEN 'A' THEN 'active'
  WHEN 'P' THEN 'pending'
  ELSE 'unknown'
END

CASE ใน SELECT

คำนวณคอลัมน์ที่สร้างขึ้น:

SELECT id, total,
       CASE
         WHEN total >= 1000 THEN 'whale'
         WHEN total >=  100 THEN 'regular'
         ELSE 'small'
       END AS bucket
FROM orders;

CASE ใน WHERE และ ORDER BY

การกรองและการจัดลำดับแบบกำหนดเอง:

-- Custom sort:
ORDER BY
  CASE WHEN status = 'urgent' THEN 0 ELSE 1 END,
  created_at DESC;

-- Conditional filter:
WHERE CASE WHEN $1 = 'paid' THEN status = 'paid'
           ELSE status IN ('pending','paid')
      END;

CASE ภายในฟังก์ชันรวม: การนับตามเงื่อนไข

เทคนิคการทำ pivot แบบคลาสสิก:

SELECT user_id,
       COUNT(*) AS total,
       SUM(CASE WHEN status = 'paid'      THEN 1 ELSE 0 END) AS paid,
       SUM(CASE WHEN status = 'pending'   THEN 1 ELSE 0 END) AS pending,
       SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled
FROM orders
GROUP BY user_id;

FILTER: ทางเลือกที่อ่านง่ายกว่า

ส่วนคำสั่ง FILTER ของ PostgreSQL อ่านได้ง่ายกว่า:

SELECT user_id,
       COUNT(*)                                     AS total,
       COUNT(*) FILTER (WHERE status = 'paid')      AS paid,
       COUNT(*) FILTER (WHERE status = 'pending')   AS pending,
       COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled
FROM orders
GROUP BY user_id;

ทำ pivot เดือนเป็นคอลัมน์

แปลงรูปแบบยาวเป็นรูปแบบกว้างด้วย CASE + ฟังก์ชันรวม:

SELECT year,
       SUM(CASE WHEN month =  1 THEN revenue END) AS jan,
       SUM(CASE WHEN month =  2 THEN revenue END) AS feb,
       -- ...
       SUM(CASE WHEN month = 12 THEN revenue END) AS dec
FROM monthly_revenue
GROUP BY year
ORDER BY year;

ทำ pivot ตามหมวดหมู่

หนึ่งแถวต่อผู้ใช้ หนึ่งคอลัมน์ต่อสถานะ:

SELECT user_id,
       SUM(total) FILTER (WHERE status = 'paid')      AS paid_total,
       SUM(total) FILTER (WHERE status = 'pending')   AS pending_total
FROM orders GROUP BY user_id;

ข้อจำกัดของ pivot ด้วย CASE

คุณต้องทราบคอลัมน์เป้าหมายตั้งแต่ตอนเขียนคำสั่ง สำหรับ pivot แบบไดนามิก ให้สร้าง SQL ในแอปพลิเคชันหรือใช้ PL/pgSQL เชิงกระบวนงาน

CASE เทียบกับ COALESCE / NULLIF

COALESCE = "ค่าแรกที่ไม่ใช่ NULL" NULLIF = "เป็น NULL หากค่าเท่ากัน" CASE มีความยืดหยุ่นมากกว่า จึงควรใช้เมื่อ COALESCE/NULLIF ไม่เหมาะกับกรณีนั้น

ความเข้ากันได้ของชนิดข้อมูล

ทุกแขนงของ CASE ต้องคืนค่าที่มีชนิดข้อมูลเข้ากันได้ หากผสมชนิดข้อมูล ให้แปลงชนิดอย่างชัดเจน:

SELECT CASE WHEN x THEN 1::TEXT ELSE 'no' END;

CASE ซ้อนกัน

การแบ่งเงื่อนไขหลายระดับ:

SELECT CASE
  WHEN amount IS NULL THEN 'no payment'
  WHEN amount = 0     THEN 'free'
  WHEN amount < 10    THEN 'cheap'
  ELSE
    CASE WHEN paid_at IS NULL THEN 'overdue' ELSE 'paid' END
END AS status FROM invoices;

สรุป

CASE คือการเขียน "if/else" แบบครอบจักรวาลใน SQL

  • คอลัมน์ที่คำนวณใน SELECT
  • การทำ pivot ผ่าน CASE ในฟังก์ชันรวมหรือ FILTER
  • ตรรกะ WHERE / ORDER BY แบบกำหนดเอง

ตรวจสอบความเข้าใจ

ส่วนคำสั่งใดอ่านได้ง่ายที่สุดสำหรับการรวมข้อมูลตามเงื่อนไขใน PostgreSQL

คำถามที่พบบ่อย

บทเรียน “นิพจน์ CASE และคำค้นแบบ Pivot” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “นิพจน์ CASE และคำค้นแบบ Pivot” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์ CASE และคำค้นแบบ Pivot”

ใช้ CASE WHEN ภายในฟังก์ชันรวม เพื่อแปลงตารางแนวตั้งเป็นรายงานตารางไขว้แนวนอน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “นิพจน์ CASE และคำค้นแบบ Pivot” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. UNION, INTERSECT, EXCEPT
  2. UNION ALL เทียบกับ UNION (ต้นทุนการลบข้อมูลซ้ำ)
  3. นิพจน์ CASE และคำค้นแบบ Pivot
  4. รูปแบบตารางไขว้ (PostgreSQL crosstab())
← กลับไปที่ SQL Academy