分组集的差异

时间:2013-03-28 06:38:52

标签: sql-server sql-server-2008 group-by

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

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

2 个答案:

答案 0 :(得分:1)

检查以下链接,这是对分组集的描述性说明。

Grouping Sets Explanation

答案 1 :(得分:1)

两个查询之间的差异是创建的分组数。可以将GROUPING SETS语法视为指定的每个分组集的UNION ALL。

例如,让我们看看你写的第一个查询:

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

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

  1. 的ProductID
  2. 产品名称
  3. Grand Total
  4. 此查询等同于编写以下代码:

    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. ProductID和ProductName
    2. Grand Total
    3. 这相当于写两个分组:

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