Working with Multiple Grouping Sets in SQL Server

Lesson 16 of 96

ЁЯФН 1. Background - рдХреНрдпреЛрдВ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝реА GROUPING SETS рдХреА?

рдЬрдм рд╣рдореЗрдВ рдПрдХ рд╣реА query рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ data рдХреЛ group рдХрд░рдХреЗ summary рдЪрд╛рд╣рд┐рдП рд╣реЛрддреА рд╣реИ, рддрдм рд╣рдо GROUPING SETS, ROLLUP рдпрд╛ CUBE рдХрд╛ use рдХрд░рддреЗ рд╣реИрдВред

ЁЯЪл рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛?

рдорд╛рди рд▓реАрдЬрд┐рдП, рд╣рдореЗрдВ employee count рдЪрд╛рд╣рд┐рдП:

  • рд╕рд┐рд░реНрдл BranchID рдкрд░
  • рд╕рд┐рд░реНрдл Gender рдкрд░
  • BranchID рдФрд░ Gender рджреЛрдиреЛрдВ рдкрд░
  • рдФрд░ total summary рднреА рдЪрд╛рд╣рд┐рдП

рддреЛ рд╣рдореЗрдВ 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ queries рдЪрд▓рд╛рдиреА рдкрдбрд╝рддреА рдереАрдВред

тЬЕ рдЕрдм рдПрдХ рд╣реА query рд╕реЗ:

Bash
GROUP BY GROUPING SETS ((BranchID), (Gender), (BranchID, Gender), ())

рдЕрдм рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЪрд╛рд░реЛрдВ summary рдорд┐рд▓ рдЬрд╛рддреА рд╣реИред


ЁЯза 2. GROUPING SETS - Custom Grouping Combinations

SQL
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)

SQL
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 рдмрдирд╛ рджреЗрддрд╛ рд╣реИ:

SQL
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():

SQL
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():

SQL
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

SQL
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

ClauseUse ForGenerates
GROUPING SETSCustom groupings you defineExact you write
ROLLUPHierarchical rollups (top-down)Subsets + Grand total
CUBEAll combinations (cross-dimensional)All possibilities
GROUPING()Flags which column is grouped (1/0)Debugging & Labeling
GROUPING_ID()Unique ID for grouped columnsSorting/Labeling

ORDER BY GROUPING(Column)

SQL
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);