อธิบาย GROUPING SETS
เลือกชุดการจัดกลุ่มที่ต้องการได้อย่าง EXACTLY
อธิบาย GROUPING SETS เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
GROUPING SETS คืออะไร
เมื่อคุณเขียนส่วนคำสั่ง GROUP BY คุณจะกำหนดคอลัมน์หนึ่งชุดที่จะใช้จัดกลุ่ม แต่บางครั้งคุณจำเป็นต้องใช้การจัดกลุ่มหลายรูปแบบในคิวรีเดียว โดยไม่ต้องเรียกใช้คิวรีหลายครั้งและใช้ UNION ALL
GROUPING SETS ช่วยให้คุณระบุได้อย่างชัดเจนว่าต้องการจัดกลุ่มแบบใดบ้าง โดยประมวลผลข้อมูลทั้งหมดเพียงครั้งเดียว แต่ละชุดในรายการจะสร้างแถวที่ผ่านการรวมค่าเป็นของตัวเองในผลลัพธ์
ตารางตัวอย่าง: การขาย
ตลอดบทเรียนนี้ เราจะใช้ตาราง การขาย ซึ่งบันทึกรายการธุรกรรมตามภูมิภาค หมวดหมู่สินค้า และจำนวนเงิน
เรียกใช้โค้ดเพื่อสร้างและเติมข้อมูลลงในตาราง เพื่อให้คุณทำตามตัวอย่างทั้งหมดได้
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Clothing', 200),
('West', 'Electronics', 300),
('West', 'Clothing', 400),
('North', 'Electronics', 150),
('North', 'Clothing', 250);วิธีเดิม: UNION ALL
ก่อนที่จะมี GROUPING SETS การหายอดรวมในหลายระดับหมายถึงการเขียนคิวรีแยกกัน แล้วนำมาต่อกันด้วย UNION ALL วิธีนี้ทำให้เกิดงานซ้ำ อ่านได้ยากกว่า และต้องอ่านตารางหลายครั้ง
ตัวอย่างด้านล่างคืนค่ายอดรวมตามภูมิภาค AND ยอดรวมตามหมวดหมู่ โดยใช้คำสั่ง SELECT แยกกันสามคำสั่ง
SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region
UNION ALL
SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category
UNION ALL
SELECT NULL, NULL, SUM(amount)
FROM sales;ไวยากรณ์ GROUPING SETS
ส่วนคำสั่ง GROUPING SETS จะวางไว้ภายในหรือใช้แทนส่วนคำสั่ง GROUP BY ปกติก็ได้ คุณระบุการจัดกลุ่มแต่ละแบบที่ต้องการเป็นรายการคอลัมน์ในวงเล็บ ชุดว่าง () หมายถึงยอดรวมทั้งหมด โดยไม่มีการจัดกลุ่มใด ๆ
คิวรีเดียวนี้ทำงานได้เหมือนกับ UNION ALL สามส่วนด้านบนทุกประการ แต่เขียนได้กระชับกว่าและอ่านตารางเพียงครั้งเดียว
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);การอ่านผลลัพธ์
แต่ละแถวในผลลัพธ์จะสังกัดชุดการจัดกลุ่มชุดใดชุดหนึ่งโดยเฉพาะ เมื่อคอลัมน์ไม่อยู่ในชุดการจัดกลุ่มที่ใช้งานอยู่ ค่าของคอลัมน์นั้นจะเป็น NULL
- แถวที่มี
region = 'East'และcategory = NULLสังกัดชุด(region) - แถวที่มี
region = NULLและcategory = 'Electronics'สังกัดชุด(category) - แถวที่ทั้งสองค่าเป็น NULL คือยอดรวมทั้งหมดจากชุด
()
ค่า NULL เหล่านี้เป็น NULL ที่เกิดจากโครงสร้าง หมายถึงค่าทั้งหมดของมิตินั้น ไม่ใช่ข้อมูลที่ขาดหาย
ชุดการจัดกลุ่มหลายคอลัมน์
แต่ละชุดการจัดกลุ่มสามารถมี มากกว่าหนึ่งคอลัมน์ ได้ ชุด (region, category) จะจัดกลุ่มตามทั้งสองคอลัมน์ร่วมกัน เช่นเดียวกับ GROUP BY region, category แบบทั่วไป
เมื่อนำชุดนี้มารวมกับชุดที่มีคอลัมน์เดียวและยอดรวมทั้งหมด จะได้สรุปข้อมูลสี่ระดับในคิวรีเดียว
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
(category),
()
);ฟังก์ชัน GROUPING()
เนื่องจาก NULL อาจหมายถึงคอลัมน์นี้ไม่ได้ถูกจัดกลุ่ม หรืออาจเป็นข้อมูลที่ขาดหายจริง ๆ SQL จึงมีฟังก์ชัน GROUPING() เพื่อแยกความหมายทั้งสองแบบออกจากกัน
GROUPING(col) จะคืนค่า 1 เมื่อคอลัมน์ถูกละออกจากชุดการจัดกลุ่มปัจจุบัน หรือกล่าวคือ NULL ของคอลัมน์นั้นเกิดจากโครงสร้าง และจะคืนค่า 0 เมื่อคอลัมน์เป็นส่วนหนึ่งของการจัดกลุ่ม หรือมีค่า NULL จริง
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_total,
GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);การแทนที่ป้ายกำกับ NULL
รูปแบบที่ใช้กันทั่วไปคือการแทนที่ NULL ที่เกิดจากโครงสร้างด้วยป้ายกำกับที่อธิบายความหมาย เพื่อให้อ่านรายงานได้ง่ายขึ้น ให้ใช้ CASE WHEN GROUPING(...) = 1 THEN 'All ...' ELSE col END เพื่อแทนที่ป้ายกำกับเฉพาะแถวจากการรวมค่า
SELECT
CASE WHEN GROUPING(region) = 1 THEN 'All Regions' ELSE region END AS region,
CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);GROUPING SETS เปรียบเทียบกับ ROLLUP
ROLLUP(a, b) เป็นรูปแบบย่อที่ขยายเป็นชุดการจัดกลุ่ม (a, b), (a), () โดยจะเพิ่มยอดรวมย่อยตามลำดับชั้นและยอดรวมทั้งหมดเสมอ
GROUPING SETS ให้อิสระในการควบคุมอย่างเต็มที่ คุณเลือกได้อย่างชัดเจนว่าต้องการให้แสดงชุดใดบ้าง หากไม่ต้องการลำดับชั้นทั้งหมด คุณก็ละเว้นบางระดับได้ คิวรีสองรายการด้านล่างให้ผลลัพธ์เหมือนกัน
-- Using ROLLUP
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),
()
);GROUPING SETS เปรียบเทียบกับ CUBE
CUBE(a, b) จะสร้างชุดการจัดกลุ่มที่เป็นไปได้ทุกแบบจากคอลัมน์ที่ระบุ ได้แก่ (a, b), (a), (b), () ซึ่งมีประโยชน์สำหรับการวิเคราะห์ข้ามมิติ แต่จะสร้างแถวจำนวนมาก
GROUPING SETS ช่วยให้คุณเลือกเฉพาะชุดที่ต้องการ ทำให้ผลลัพธ์ตรงประเด็นและคิวรีทำงานได้รวดเร็ว
-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);
-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);กรณีใช้งานจริง: แดชบอร์ดยอดขาย
แดชบอร์ดจริงมักต้องการทั้งรายละเอียดระดับแถว ยอดรวมย่อยตามแผนก และยอดรวมทั้งหมดในชุดผลลัพธ์เดียว GROUPING SETS ทำให้ทำสิ่งนี้ได้ง่าย โดยไม่ต้องรวมค่าที่ฝั่งแอปพลิเคชันหรือส่งคำขอหลายรอบ
คิวรีนี้คืนค่าแถวรายละเอียดแยกตามภูมิภาคและหมวดหมู่ ยอดรวมย่อยเฉพาะภูมิภาค และแถวยอดรวมทั้งหมดเพียงหนึ่งแถว โดยเรียงลำดับให้แถวยอดรวมทั้งหมดอยู่ท้ายสุด
SELECT
COALESCE(region, 'TOTAL') AS region,
COALESCE(category, 'ALL') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY
GROUPING(region),
region NULLS LAST,
GROUPING(category),
category NULLS LAST;ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ GROUPING SETS
สรุปบทเรียน
สิ่งที่คุณได้เรียนรู้เกี่ยวกับ GROUPING SETS มีดังนี้:
- GROUPING SETS ช่วยให้คุณกำหนดชุดการจัดกลุ่มหลายรูปแบบในคิวรีเดียว แทนรูปแบบ UNION ALL ที่ต้องเขียนซ้ำ
- แต่ละชุดจะระบุเป็นรายการคอลัมน์ในวงเล็บภายใน
GROUP BY GROUPING SETS (...)ชุดว่าง()จะสร้างยอดรวมทั้งหมด - คอลัมน์ที่ไม่อยู่ในชุดที่ใช้งานจะแสดงเป็น NULL ในแถวนั้น ให้ใช้
GROUPING(col)เพื่อตรวจหา NULL ที่เกิดจากโครงสร้างเหล่านี้ - ROLLUP และ CUBE เป็นรูปแบบย่อที่สะดวกสำหรับรูปแบบการใช้งานทั่วไป แต่ GROUPING SETS ให้คุณควบคุมได้อย่างเต็มที่และแม่นยำว่าต้องรวมการจัดกลุ่มใดบ้าง
- ใช้ร่วมกับ COALESCE หรือ CASE WHEN GROUPING(...) เพื่อแทนที่ NULL ด้วยป้ายกำกับที่อ่านเข้าใจง่ายในรายงาน
คำถามที่พบบ่อย
บทเรียน “อธิบาย GROUPING SETS” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “อธิบาย GROUPING SETS” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “อธิบาย GROUPING SETS”
เลือกชุดการจัดกลุ่มที่ต้องการได้อย่าง EXACTLY คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “อธิบาย GROUPING SETS” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- มากกว่า GROUP BY เพียงระดับเดียว
- ROLLUP สำหรับผลรวมย่อย
- CUBE สำหรับชุดค่าผสมทั้งหมด
- อธิบาย GROUPING SETS