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

ROLLUP สำหรับผลรวมย่อย

คำนวณผลรวมย่อยและผลรวมทั้งหมด

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

ROLLUP คืออะไร

เมื่อจัดกลุ่มข้อมูลด้วย GROUP BY คุณจะได้หนึ่งแถวต่อกลุ่ม แต่บ่อยครั้งคุณยังต้องการยอดรวมย่อยของแต่ละกลุ่มและยอดรวมทั้งหมดของทุกแถว ซึ่งตรงกับสิ่งที่ ROLLUP ทำได้

ROLLUP เป็นส่วนขยายของ GROUP BY ที่เพิ่มแถวสรุปเพิ่มเติมให้กับชุดผลลัพธ์โดยอัตโนมัติ ทำให้ได้ยอดรวมย่อยสะสมในแต่ละระดับของลำดับชั้นการจัดกลุ่ม และมียอดรวมทั้งหมดอยู่ท้ายสุด

การตั้งค่าข้อมูลตัวอย่าง

เรามาสร้างตาราง การขาย อย่างง่ายเพื่อใช้ฝึกปฏิบัติกัน ตารางนี้เก็บภูมิภาค หมวดหมู่ผลิตภัณฑ์ และจำนวนเงินการขายของแต่ละธุรกรรม เรียกใช้คำสั่งด้านล่างเพื่อสร้างตารางและเพิ่มข้อมูลลงในตาราง

CREATE TABLE sales (
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Electronics', 300),
  ('East',  'Clothing',    150),
  ('West',  'Electronics', 700),
  ('West',  'Clothing',    200),
  ('West',  'Clothing',    100);

เริ่มจาก GROUP BY แบบปกติ

ก่อนใช้ ROLLUP เรามาดูกันก่อนว่า GROUP BY ปกติให้ผลลัพธ์อย่างไร คำสั่งสอบถามด้านล่างจะคืนยอดรวมหนึ่งรายการต่อคู่ (ภูมิภาค, หมวดหมู่) โดยไม่มียอดรวมย่อยและไม่มียอดรวมทั้งหมด

SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY region, category
ORDER  BY region, category;

แนะนำ GROUP BY ROLLUP

แทนที่ GROUP BY ด้วย GROUP BY ROLLUP(...) แล้ว SQL จะเพิ่มแถวยอดรวมย่อยโดยอัตโนมัติ คอลัมน์ภายใน ROLLUP() จะสร้างลำดับชั้น และจะมียอดรวมย่อยสำหรับแต่ละระดับของลำดับชั้นนั้น พร้อมยอดรวมทั้งหมดในท้ายสุด

SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

การอ่านผลลัพธ์ ROLLUP

ผลลัพธ์จาก ROLLUP ประกอบด้วยแถวสามประเภท:

  • แถวรายละเอียด — หนึ่งแถวต่อชุดผสม (ภูมิภาค, หมวดหมู่) เช่นเดียวกับ GROUP BY แบบปกติ
  • แถวยอดรวมย่อย — หนึ่งแถวต่อภูมิภาค โดยมี category = NULL เพื่อแสดงยอดรวมของภูมิภาคนั้น
  • แถวยอดรวมทั้งหมด — หนึ่งแถวที่ทั้งภูมิภาคและหมวดหมู่เป็น NULL เพื่อแสดงยอดรวมโดยรวม

ค่า NULL ทำหน้าที่เป็นตัวยึดตำแหน่งเพื่อระบุระดับที่มีการสรุป

ใช้ COALESCE เพื่อติดป้ายกำกับค่า NULL

เครื่องหมาย NULL อาจทำให้ผู้ใช้ปลายทางสับสนได้ ให้ห่อหุ้มแต่ละคอลัมน์ด้วย COALESCE เพื่อแทนที่ค่าเหล่านั้นด้วยป้ายกำกับที่มีความหมาย เช่น 'ทุกหมวดหมู่' และ 'ยอดรวมทั้งหมด'

SELECT
  COALESCE(region,   'Grand Total')    AS region,
  COALESCE(category, 'All Categories') AS category,
  SUM(amount)                          AS total
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

ROLLUP คอลัมน์เดียว

ROLLUP ใช้กับคอลัมน์เดียวได้เช่นกัน เมื่อเขียน ROLLUP(region) คุณจะได้หนึ่งแถวต่อภูมิภาค และแถวยอดรวมทั้งหมดเพียงแถวเดียวในท้ายผลลัพธ์ รูปแบบนี้ง่ายที่สุดและเหมาะสำหรับรายงานที่ต้องการยอดรวมสะสมอยู่ใต้แถวรายละเอียด

SELECT
  COALESCE(region, 'Grand Total') AS region,
  SUM(amount)                     AS total
FROM   sales
GROUP  BY ROLLUP(region)
ORDER  BY region;

ROLLUP สามระดับ

คุณสามารถส่งคอลัมน์สามคอลัมน์ขึ้นไปให้ ROLLUP เพื่อสร้างลำดับชั้นที่ลึกขึ้นได้ เมื่อใช้ ROLLUP(year, region, category) คุณจะได้ยอดรวมย่อยต่อปี+ภูมิภาค ยอดรวมย่อยต่อปี และยอดรวมทั้งหมด โดยแต่ละคอลัมน์ที่เพิ่มจะเพิ่มระดับการสรุปอีกหนึ่งระดับ

-- Extend the demo with a year column
SELECT
  COALESCE(CAST(yr AS TEXT), 'All Years')     AS year,
  COALESCE(region,   'All Regions')            AS region,
  COALESCE(category, 'All Categories')         AS category,
  SUM(amount)                                  AS total
FROM (
  SELECT 2024 AS yr, region, category, amount FROM sales
  UNION ALL
  SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP  BY ROLLUP(yr, region, category)
ORDER  BY yr, region, category;

ตรวจหาแถวสรุปด้วย GROUPING()

ฟังก์ชัน GROUPING() จะคืนค่า 1 เมื่อค่าคอลัมน์ในแถวนั้นเป็นค่า NULL ที่ ROLLUP สร้างขึ้น (ตัวยึดตำแหน่งสรุป) และคืนค่า 0 เมื่อเป็นค่าจริงของข้อมูล วิธีนี้ช่วยให้คุณแยกข้อมูล NULL จริงออกจาก NULL ที่เป็นสรุปของ ROLLUP ได้

SELECT
  region,
  category,
  SUM(amount)        AS total,
  GROUPING(region)   AS is_region_summary,
  GROUPING(category) AS is_cat_summary
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

การกรองแถวสรุป

เนื่องจาก ROLLUP เพิ่มแถวหลังการรวมข้อมูล คุณจึงไม่สามารถกรองแถวเหล่านี้ด้วย WHERE ได้ ให้ใช้ HAVING หรือห่อหุ้มคำสั่งสอบถามทั้งหมดไว้ในคำสั่งสอบถามย่อย ตัวอย่างด้านล่างจะแสดงเฉพาะยอดรวมย่อยระดับภูมิภาค (แถวที่หมวดหมู่เป็นค่า NULL จาก ROLLUP แต่ภูมิภาคเป็นค่าจริง)

SELECT region, SUM(amount) AS regional_total
FROM   sales
GROUP  BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
   AND GROUPING(region)   = 0
ORDER  BY region;

ROLLUP กับ GROUPING SETS

ROLLUP(a, b) เป็นรูปแบบย่อของ GROUPING SETS ชุดหนึ่งโดยเฉพาะ คำสั่งสอบถามสองรายการด้านล่างให้ผลเหมือนกันทุกประการ — ROLLUP เพียงช่วยให้คุณไม่ต้องเขียนระดับการจัดกลุ่มทุกระดับด้วยตนเอง

-- Using ROLLUP (concise)
SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY ROLLUP(region, category);

-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY GROUPING SETS(
  (region, category),
  (region),
  ()
);

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

ทดสอบความเข้าใจเกี่ยวกับ ROLLUP ด้วยคำถามนี้

สรุปบทเรียน

ทำได้ดีมาก ต่อไปนี้คือสรุปสิ่งที่คุณได้เรียนรู้เกี่ยวกับ ROLLUP:

  • GROUP BY ROLLUP(a, b) จะสร้างยอดรวมย่อยสำหรับแต่ละระดับของลำดับชั้นคอลัมน์และยอดรวมทั้งหมดของทุกแถวโดยอัตโนมัติ
  • แถวสรุปจะระบุด้วยค่า NULL ในคอลัมน์ที่ถูกรวมขึ้นสู่ระดับบน ให้ใช้ COALESCE เพื่อกำหนดป้ายกำกับที่อ่านเข้าใจได้
  • ฟังก์ชัน GROUPING() จะคืนค่า 1 สำหรับ NULL ที่ ROLLUP สร้างขึ้น และคืนค่า 0 สำหรับค่าจริงของข้อมูล คุณจึงแยกแยะสองกรณีนี้ได้
  • ใช้ HAVING GROUPING(...) = 1 เพื่อกรองเฉพาะแถวสรุป
  • ROLLUP(a, b) เป็นรูปแบบย่อของ GROUPING SETS((a, b), (a), ())

ROLLUP เป็นเครื่องมือหลักเมื่อรายงานของคุณต้องการยอดรวมย่อยและยอดรวมทั้งหมด โดยไม่ต้องเขียนคำสั่งสอบถาม UNION ที่ซับซ้อน

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

บทเรียน “ROLLUP สำหรับผลรวมย่อย” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ROLLUP สำหรับผลรวมย่อย”

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

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

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

บทเรียน “ROLLUP สำหรับผลรวมย่อย” ใช้เวลานานแค่ไหน

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

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

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

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

  1. มากกว่า GROUP BY เพียงระดับเดียว
  2. ROLLUP สำหรับผลรวมย่อย
  3. CUBE สำหรับชุดค่าผสมทั้งหมด
  4. อธิบาย GROUPING SETS
← กลับไปที่ SQL Academy