CREATE TABLE #Product (ProductId INT, ProductName Varchar(500), Price MONEY)
INSERT INTO #Product (ProductId ,ProductName,Price)
VALUES(1, 'Test1', 12000),
(2, 'Test2', 18000),
(3, 'Test3', 25000),
(4, 'Test4', 15000),
(1, 'Test4', 15000)
SELECT ProductId ,ProductName, SUM(Price) AS Price
FROM #Product Group By
GROUPING SETS((ProductId), (ProductName), ())
SELECT ProductId ,ProductName, SUM(Price) AS Price
FROM #Product Group By
GROUPING SETS((ProductId, ProductName), ())
这两者有什么不同?以及在哪里使用第一个和第二个
答案 0 :(得分:1)
检查以下链接,这是对分组集的描述性说明。
答案 1 :(得分:1)
两个查询之间的差异是创建的分组数。可以将GROUPING SETS
语法视为指定的每个分组集的UNION ALL。
例如,让我们看看你写的第一个查询:
SELECT ProductId ,ProductName, SUM(Price) AS Price
FROM #Product Group By
GROUPING SETS((ProductId), (ProductName), ())
在这里,您指定了三个分组:
此查询等同于编写以下代码:
SELECT ProductID, NULL AS ProductName, SUM(Price) AS Price
FROM #Product
GROUP BY ProductID
UNION ALL
SELECT NULL, ProductName, SUM(Price)
FROM #Product
GROUP BY ProductName
UNION ALL
SELECT NULL, NULL, SUM(Price)
FROM #Product
同样,查看第二个查询:
SELECT ProductId ,ProductName, SUM(Price) AS Price
FROM #Product Group By
GROUPING SETS((ProductId, ProductName), ())
此查询执行两个分组:
这相当于写两个分组:
SELECT ProductId ,ProductName, SUM(Price) AS Price
FROM #Product
GROUP BY ProductID, ProductName
UNION ALL
SELECT NULL, NULL, SUM(Price) AS Price
FROM #Product
至于为什么要使用一个而不是另一个:你想要哪个分组?您想要按产品ID,总产品名称和总计吗?然后使用第一个。如果产品的名称与您的示例中的产品ID相同,则此功能非常有用。
您是否想要按产品ID和产品名称以及总计的总数?然后使用第二个。