ЁЯФН 1. Background - рдХреНрдпреЛрдВ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝реА GROUPING SETS рдХреА?
рдЬрдм рд╣рдореЗрдВ рдПрдХ рд╣реА query рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ data рдХреЛ group рдХрд░рдХреЗ summary рдЪрд╛рд╣рд┐рдП рд╣реЛрддреА рд╣реИ, рддрдм рд╣рдо GROUPING SETS, ROLLUP рдпрд╛ CUBE рдХрд╛ use рдХрд░рддреЗ рд╣реИрдВред
ЁЯЪл рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛?
рдорд╛рди рд▓реАрдЬрд┐рдП, рд╣рдореЗрдВ employee count рдЪрд╛рд╣рд┐рдП:
- рд╕рд┐рд░реНрдл
BranchIDрдкрд░ - рд╕рд┐рд░реНрдл
Genderрдкрд░ BranchIDрдФрд░GenderрджреЛрдиреЛрдВ рдкрд░- рдФрд░ total summary рднреА рдЪрд╛рд╣рд┐рдП
рддреЛ рд╣рдореЗрдВ 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ queries рдЪрд▓рд╛рдиреА рдкрдбрд╝рддреА рдереАрдВред
тЬЕ рдЕрдм рдПрдХ рд╣реА query рд╕реЗ:
GROUP BY GROUPING SETS ((BranchID), (Gender), (BranchID, Gender), ())
рдЕрдм рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЪрд╛рд░реЛрдВ summary рдорд┐рд▓ рдЬрд╛рддреА рд╣реИред
ЁЯза 2. GROUPING SETS - Custom Grouping Combinations
SELECT BranchID, Gender, COUNT(*) AS TotalEmployee
FROM EmployeeDetails
GROUP BY GROUPING SETS (
(BranchID),
(Gender),
(BranchID, Gender),
()
);

NULL рдХрд╛ рдорддрд▓рдм рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ column рдореЗрдВ aggregate result рджрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
ЁЯФБ 3. ROLLUP - Hierarchy-Based Summary
ROLLUP tab use рдХрд░рддреЗ рд╣реИрдВ рдЬрдм hierarchy рд╣реЛ тАФ рдЬреИрд╕реЗ: Country тЖТ State тЖТ City
рдпрд╛ BranchID тЖТ Gender (рдЬреИрд╕реЗ рдкрд╣рд▓реЗ branch рдХрд╛ total, рдлрд┐рд░ gender-wise)
SELECT BranchID, Gender, COUNT(*) AS TotalEmployee
FROM EmployeeDetails
GROUP BY ROLLUP (BranchID, Gender)

рдпрд╣ grouping sets рдХреЛ internally generate рдХрд░рддрд╛ рд╣реИ:
- (BranchID, Gender)
- (BranchID)
- ()
рдорддрд▓рдм hierarchy рдореЗрдВ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рдХреА рддрд░рдл summarize рдХрд░рддрд╛ рд╣реИред
ЁЯФ▓ 4. CUBE - All Possible Combinations
CUBE рд╕рдм combinations рдмрдирд╛ рджреЗрддрд╛ рд╣реИ:
SELECT BranchID, Gender, COUNT(*) AS TotalEmployee
FROM EmployeeDetails
GROUP BY CUBE (BranchID, Gender)

рдЗрд╕рд╕реЗ рдпреЗ 4 grouping sets рдорд┐рд▓рддреЗ рд╣реИрдВ:
- (BranchID, Gender)
- (BranchID)
- (Gender)
- ()
CUBE = full cross summary across all dimensions
ЁЯзо 5. GROUPING() рдФрд░ GROUPING_ID() рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ?
рдЬрдм рдЖрдк aggregated rows рджреЗрдЦрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ NULL in BranchID), рддреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП:
ЁЯз╛ GROUPING():
SELECT
BranchID,
Gender,
GROUPING(BranchID) AS BranchGrouping,
GROUPING(Gender) AS GenderGrouping,
COUNT(*) AS TotalEmployee
FROM EmployeeDetails
GROUP BY ROLLUP(BranchID, Gender);

ЁЯФв GROUPING(ColumnName) рдХрд╛ рдорддрд▓рдм:
| Value | рдорддрд▓рдм |
|---|---|
0 | рдпрд╣ column group by clause рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ тЖТ рдпрд╛рдиреА actual value use рд╣реЛ рд░рд╣реА рд╣реИ |
1 | рдпрд╣ column group by clause рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ тЖТ рдпрд╛рдиреА summary row рд╣реИ (value NULL рд╣реЛрдЧреА) |
ЁЯз╛ GROUPING_ID():
SELECT
GROUPING_ID(BranchID, Gender) AS GroupID,
BranchID,
Gender,
COUNT(*) AS TotalEmployee
FROM EmployeeDetails
GROUP BY CUBE(BranchID, Gender);

GROUPING_ID()рд╕реЗ unique ID рдорд┐рд▓рддреА рд╣реИ рд╣рд░ combination рдХреЗ рд▓рд┐рдП:- (BranchID, Gender) тЖТ 0
- (BranchID) тЖТ 1
- (Gender) тЖТ 2
- () тЖТ 3
ЁЯТ╝ Real-World Use Case: Report with All Summaries
Imagine an HR Dashboard where you want:
- Total employees per branch
- Total employees per gender
- Branch-wise male/female breakdown
- Grand total
Without GROUPING SETS:
Multiple UNION queries ЁЯШй
With GROUPING SETS / CUBE / ROLLUP:
One clean query ЁЯШО
тЬНя╕П Bonus: Query Enhancement with Labeling
SELECT
BranchID,
Gender,
COUNT(*) AS TotalEmployee,
CASE
WHEN GROUPING_ID(BranchID, Gender) = 0 THEN 'Branch + Gender'
WHEN GROUPING_ID(BranchID, Gender) = 1 THEN 'Branch Only'
WHEN GROUPING_ID(BranchID, Gender) = 2 THEN 'Gender Only'
WHEN GROUPING_ID(BranchID, Gender) = 3 THEN 'Grand Total'
END AS GroupLabel
FROM EmployeeDetails
GROUP BY CUBE(BranchID, Gender)
ORDER BY GroupLabel;

тЬЕ Summary
| Clause | Use For | Generates |
|---|---|---|
GROUPING SETS | Custom groupings you define | Exact you write |
ROLLUP | Hierarchical rollups (top-down) | Subsets + Grand total |
CUBE | All combinations (cross-dimensional) | All possibilities |
GROUPING() | Flags which column is grouped (1/0) | Debugging & Labeling |
GROUPING_ID() | Unique ID for grouped columns | Sorting/Labeling |
ORDER BY GROUPING(Column)
SELECT
BranchID,
Gender,
COUNT(*) AS TotalEmployees,
GROUPING(BranchID) AS IsBranchGrouped,
GROUPING(Gender) AS IsGenderGrouped
FROM EmployeeDetails
GROUP BY CUBE(BranchID, Gender)
ORDER BY GROUPING(BranchID), GROUPING(Gender);
