มากกว่า GROUP BY เพียงระดับเดียว
รวมค่าในหลายระดับ
มากกว่า GROUP BY เพียงระดับเดียว เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ข้อจำกัดของ GROUP BY เพียงรายการเดียว
ส่วนคำสั่ง GROUP BY มาตรฐานช่วยให้คุณรวมแถวในระดับใดระดับหนึ่งได้ เช่น ยอดขายรวมต่อภูมิภาค แต่หากคุณต้องการยอดรวมต่อหมวดหมู่สินค้าและผลรวมทั้งหมดในคำสั่งสอบถามเดียวกันด้วยจะทำอย่างไร
การทำซ้ำคำสั่งสอบถามสามครั้งแล้วใช้ UNION ALL ใช้งานได้ แต่ยืดเยื้อและช้า ภาษาสอบถามฐานข้อมูลจึงมีส่วนขยายทรงพลังสามอย่าง ได้แก่ GROUPING SETS, ROLLUP และ CUBE ซึ่งแก้ปัญหานี้ได้อย่างมีประสิทธิภาพในการประมวลผลเพียงรอบเดียว
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;การตั้งค่าตารางตัวอย่าง
ตลอดทั้งบทเรียนนี้ เราจะใช้ตาราง sales อย่างง่าย ซึ่งบันทึกรายการขายแต่ละรายการพร้อมด้วย ภูมิภาค หมวดหมู่ และ จำนวนเงิน เรามาสร้างและเพิ่มข้อมูลลงในตาราง เพื่อให้คำสั่งสอบถามที่จะใช้ต่อจากนี้เข้าใจได้ในบริบท
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales (region, category, amount) VALUES
('North', 'Electronics', 1200),
('North', 'Clothing', 800),
('South', 'Electronics', 950),
('South', 'Clothing', 600),
('East', 'Electronics', 1100),
('East', 'Clothing', 750);GROUPING SETS คืออะไร
GROUPING SETS ช่วยให้คุณกำหนดระดับการจัดกลุ่มหลายระดับที่เป็นอิสระต่อกันภายในส่วนคำสั่ง GROUP BY เดียวกัน แต่ละชุดในรายการจะสร้างกลุ่มแถวของตนเอง ราวกับว่าคุณเขียนคำสั่งสอบถามแยกกันแล้วรวมผลด้วย UNION ALL
ไวยากรณ์คือ: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ) ชุดว่าง () หมายถึงยอดรวมทั้งหมดของทุกแถว
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);การอ่านผลลัพธ์ GROUPING SETS
เมื่อเรียกใช้คำสั่งสอบถาม GROUPING SETS แถวจากระดับการจัดกลุ่มที่แตกต่างกันจะถูกวางต่อกัน คอลัมน์ที่ไม่ได้อยู่ในชุดใดชุดหนึ่งจะแสดงเป็น NULL ในแถวนั้น
ตัวอย่างเช่น แถวที่อยู่ในชุด (region) จะมีค่า NULL ในคอลัมน์ category ซึ่งบ่งชี้ว่ายอดรวมนี้ครอบคลุมทุกหมวดหมู่ในภูมิภาคนั้น แถวยอดรวมทั้งหมด (ชุดว่าง) จะมีค่า NULL ทั้งใน region และ category
SELECT
COALESCE(region, 'ALL REGIONS') AS region,
COALESCE(category, 'ALL CATEGORIES') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY region NULLS LAST, category NULLS LAST;แนะนำ ROLLUP
ROLLUP เป็นทางลัดสำหรับชุดการจัดกลุ่มตามลำดับชั้นที่ใช้บ่อย เมื่อกำหนดคอลัมน์ (A, B) แล้ว ROLLUP(A, B) จะสร้างชุดต่อไปนี้โดยอัตโนมัติ: (A, B) (A) และ ()
วิธีนี้เหมาะอย่างยิ่งกับข้อมูลตามลำดับชั้น เช่น ปีไปยังเดือนไปยังวัน หรือภูมิภาคไปยังหมวดหมู่ จำนวนชุดที่สร้างได้จะเป็น n + 1 เสมอ โดย n คือจำนวนคอลัมน์ที่ระบุ
-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;ROLLUP สามระดับ
การเพิ่มคอลัมน์ที่สามให้กับ ROLLUP จะขยายลำดับชั้นเพิ่มอีกหนึ่งระดับ ROLLUP(A, B, C) จะสร้างชุดสี่ชุด ได้แก่ (A, B, C) (A, B) (A) และ ()
ในตัวอย่างด้านล่าง year คือระดับนอกสุด และ category เป็นระดับที่มีรายละเอียดมากที่สุด คำสั่งสอบถามจะสร้างยอดรวมย่อยในทุกขั้นของลำดับชั้น พร้อมแถวยอดรวมทั้งหมดอีกหนึ่งแถว
SELECT
year,
region,
category,
SUM(amount) AS total
FROM (
VALUES
(2024, 'North', 'Electronics', 1200),
(2024, 'North', 'Clothing', 800),
(2024, 'South', 'Electronics', 950),
(2025, 'North', 'Electronics', 1400),
(2025, 'South', 'Clothing', 700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;แนะนำ CUBE
CUBE ครอบคลุมมากกว่า ROLLUP เมื่อมีคอลัมน์ n รายการ จะสร้าง ชุดการจัดกลุ่มที่เป็นไปได้ทั้งหมด 2^n แบบ รวมถึงยอดรวมทั้งหมดด้วย
สำหรับ CUBE(region, category) ชุดที่สร้างได้คือ: (region, category) (region) (category) และ () — รวมทั้งหมดสี่ชุด วิธีนี้มีประโยชน์เมื่อคุณต้องการยอดรวมแยกตามมิติในทุกทิศทาง ไม่ใช่เพียงลำดับชั้นเดียว
-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;CUBE กับ ROLLUP — ควรใช้แบบใด
ให้เลือกตามมิติของข้อมูลว่ามีลำดับชั้นตามธรรมชาติหรือไม่:
- ใช้ ROLLUP เมื่อคอลัมน์มีลำดับชั้น (เช่น ประเทศไปยังเมืองไปยังร้านค้า) ยอดรวมย่อยจะไล่ขึ้นตามเส้นทางเดียวเท่านั้น
- ใช้ CUBE เมื่อคอลัมน์เป็นมิติที่เป็นอิสระต่อกัน (เช่น ภูมิภาคและหมวดหมู่) และคุณต้องการทุกการตัดมิติที่เป็นไปได้
- ใช้ GROUPING SETS เมื่อคุณต้องการควบคุมอย่างเต็มที่ และทั้ง ROLLUP และ CUBE ไม่ตรงกับข้อกำหนดของคุณ
ฟังก์ชัน GROUPING()
เนื่องจาก NULL อาจหมายถึงค่าที่หายไปจริง หรือเป็นตัวยึดตำแหน่งของการจัดกลุ่ม SQL จึงมีฟังก์ชัน GROUPING() ให้ใช้ ฟังก์ชันนี้คืนค่า 1 เมื่อคอลัมน์เป็นส่วนหนึ่งของแถวการรวมระดับสูง (ตัวยึดตำแหน่ง) และคืนค่า 0 เมื่อมีการจัดกลุ่มตามคอลัมน์นั้นจริง
วิธีนี้ช่วยให้คุณแยกความแตกต่างระหว่าง NULL ใน region ที่เป็นค่าจริง กับแถวยอดรวมย่อยที่ครอบคลุมทุกภูมิภาค
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_subtotal,
GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;การใช้ GROUPING() เพื่อติดป้ายกำกับแถว
รูปแบบที่ใช้กันทั่วไปคือการใช้ GROUPING() ร่วมกับนิพจน์ CASE เพื่อสร้างป้ายกำกับที่อ่านเข้าใจได้ แทนการแสดงค่า NULL ดิบ ๆ วิธีนี้ทำให้ผลลัพธ์ของคำสั่งสอบถาม ROLLUP หรือ CUBE อ่านได้ง่ายขึ้นมากในรายงาน
SELECT
CASE GROUPING(region)
WHEN 1 THEN 'Grand Total'
ELSE region
END AS region_label,
CASE GROUPING(category)
WHEN 1 THEN 'All Categories'
ELSE category
END AS category_label,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;การผสมคอลัมน์คงที่กับ ROLLUP
คุณสามารถใช้คอลัมน์ GROUP BY ปกติร่วมกับ ROLLUP หรือ CUBE ในส่วนคำสั่งเดียวกันได้ คอลัมน์ที่อยู่นอก ROLLUP(...) จะถูกรวมอยู่ในทุกชุดการจัดกลุ่มเสมอ และจะไม่ถูกรวมขึ้นสู่ระดับบน
ในคำสั่งสอบถามด้านล่าง year เป็นคอลัมน์การจัดกลุ่มคงที่ ส่วน region และ category จะมีส่วนร่วมใน ROLLUP ดังนั้นคุณจะได้ยอดรวมย่อยแยกตามปี ไม่ใช่ยอดรวมข้ามทุกปี
SELECT
2024 AS year,
region,
category,
SUM(amount) AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับ GROUPING SETS, ROLLUP และ CUBE
สรุป — เหนือกว่าการใช้ GROUP BY เพียงชุดเดียว
ในบทเรียนนี้ คุณได้เรียนรู้ส่วนขยาย SQL ทรงพลังสามอย่างที่ช่วยให้สร้างระดับการรวมหลายระดับได้ภายในคำสั่งสอบถามเดียว:
- GROUPING SETS — ควบคุมด้วยตนเองได้อย่างเต็มที่ โดยระบุชุดผสมที่ต้องการอย่างชัดเจน
- ROLLUP — เหมาะสำหรับลำดับชั้น โดยรวมขึ้นจากระดับที่มีรายละเอียดมากที่สุดไปจนถึงยอดรวมทั้งหมด
- CUBE — สร้างการตัดมิติที่เป็นไปได้ทั้งหมดของมิติที่ระบุ
คุณยังได้เรียนรู้ว่า GROUPING() ช่วยแยกค่า NULL จริงออกจากแถวตัวยึดตำแหน่งของการรวมระดับสูง และรูปแบบ CASE GROUPING(...) ช่วยสร้างผลลัพธ์รายงานที่เป็นระเบียบและอ่านง่าย
เครื่องมือเหล่านี้ขาดไม่ได้เมื่อคุณต้องการสรุปข้อมูลหลายมิติ ไม่ว่าจะเป็นรายงานรูปแบบพิวอต แดชบอร์ด หรือคำสั่งสอบถามคลังข้อมูล ซึ่งล้วนพึ่งพาเครื่องมือเหล่านี้อย่างมาก
คำถามที่พบบ่อย
บทเรียน “มากกว่า GROUP BY เพียงระดับเดียว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “มากกว่า GROUP BY เพียงระดับเดียว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “มากกว่า GROUP BY เพียงระดับเดียว”
รวมค่าในหลายระดับ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “มากกว่า GROUP BY เพียงระดับเดียว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- มากกว่า GROUP BY เพียงระดับเดียว
- ROLLUP สำหรับผลรวมย่อย
- CUBE สำหรับชุดค่าผสมทั้งหมด
- อธิบาย GROUPING SETS