您的位置:首页 > 数据库

SQL Server 中的group by, rollup 和 grouping关键字的用法

2013-09-18 10:20 351 查看
GROUP BY groups the result set into summary rows by provided columns. For example, consider below data which contains sales figures by region.
Group Name SalesYTD
—————— ——————- —————
North America Northwest 123237.00
North America Northwest 37534.00
North America Northwest 48003.00
North America Southwest 164232.00
North America Southeast 39667.00
North America Southeast 105810.00
Europe France 74569.00
Europe Germany 59456.00
Pacific Australia 93403.00

Europe United Kingdom 78327.00

This data can be summarized using a GROUP BY clause as below:

– © 2011 – Vishal (http://SqlAndMe.com)

SELECT [Group], [Name], SUM([SalesYTD]) AS 'Total
Sales'
FROM #TempTable
GROUP BY [Group], [Name]
ORDER BY [Group], [Name]
Result Set:
Group Name Total Sales
—————— —————— —————–
Europe France 74569.00
Europe Germany 59456.00
Europe United Kingdom 78327.00
North America Northwest 208774.00
North America Southeast 145477.00
North America Southwest 164232.00
Pacific Australia 93403.00

(7 row(s) affected)
In the above result we can see that the data is summarized by [Group] and [Name].

WITH ROLLUP:
ROLLUP can be used to generate a subtotal rows and a grand total row for aggregate rows.
SELECT [Group], [Name], SUM([SalesYTD]) AS 'Total
Sales'
FROM #TempTable
GROUP BY [Group], [Name] WITH ROLLUP
Result Set:
Group Name Total Sales
——————- ——————- ———————
Europe France 74569.00
Europe Germany 59456.00
Europe United Kingdom 78327.00
Europe NULL 212352.00
North America Northwest 208774.00
North America Southeast 145477.00
North America Southwest 164232.00
North America NULL 518483.00
Pacific Australia 93403.00
Pacific NULL 93403.00
NULL NULL 824238.00

(11 row(s) affected)
As we can see in the result set, 4 rows have been added, 3 for sub total of each [Group], and 1 row for grand total.

GROUPING():
GROUPING() function can be used to check whether the row is aggregated or not. It returns 1 for aggregated rows.
– © 2011 – Vishal (http://SqlAndMe.com)

SELECT [Group], [Name], SUM([SalesYTD]) AS 'Total
Sales',
GROUPING([Group]) AS 'Aggregated',
GROUPING([Name]) AS 'Aggregated'
FROM #TempTable
GROUP BY [Group], [Name] WITH ROLLUP
Result Set:
Group Name Total Sales Aggregated Aggregated
——————- ——————– ————- ———— ————
Europe France 74569.00 0 0
Europe Germany 59456.00 0 0
Europe United Kingdom 78327.00 0 0
Europe NULL 212352.00 0 1
North America Northwest 208774.00 0 0
North America Southeast 145477.00 0 0
North America Southwest 164232.00 0 0
North America NULL 518483.00 0 1
Pacific Australia 93403.00 0 0
Pacific NULL 93403.00 0 1
NULL NULL 824238.00 1 1

(11 row(s) affected)

Finally, we can use GROUPING() function to identify and replace the 'NULL' in aggregated rows to something meaningful. for example, 'ALL'!!!!.
SELECT CASE GROUPING([Group])
WHEN 1 THEN 'ALL'
ELSE [Group] END AS 'Group',
CASE GROUPING([Name])
WHEN 1 THEN 'ALL'
ELSE [Name] END AS 'Name',
SUM([SalesYTD]) AS 'Total Sales'
FROM #TempTable
GROUP BY [Group], [Name] WITH ROLLUP
Result Set:
Group Name Total Sales
—————— ——————- ——————–
Europe France 74569.00
Europe Germany 59456.00
Europe United Kingdom 78327.00
Europe ALL 212352.00
North America Northwest 208774.00
North America Southeast 145477.00
North America Southwest 164232.00
North America ALL 518483.00
Pacific Australia 93403.00
Pacific ALL 93403.00
ALL ALL 824238.00

(11 row(s) affected)
Hope This Helps!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: