1
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), ())

这两者有什么区别?以及在哪里使用第一个和第二个

4

2 回答 2

1

检查下面的链接,这是对分组集的描述性解释。

分组集说明

于 2013-03-28T07:39:24.123 回答
1

两个查询之间的区别在于创建的分组数量。可以将GROUPING SETS语法视为指定的每个分组集的 UNION ALL。

例如,让我们看一下您编写的第一个查询:

SELECT ProductId ,ProductName, SUM(Price) AS Price
FROM #Product Group By
GROUPING SETS((ProductId), (ProductName), ())

在这里,您指定了三个分组:

  1. 产品编号
  2. 产品名称
  3. 累计

此查询等效于编写以下代码:

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), ())

此查询执行两个分组:

  1. 产品 ID 和产品名称
  2. 累计

这相当于写了两个分组:

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 和产品名称进行总计以及总计吗?然后使用第二个。

于 2014-06-24T20:58:40.467 回答