2013-03-28 64 views
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),()) 

這兩個有什麼不同?以及在哪裏使用第一個和第二個分組集的差異

回答

1

兩個查詢之間的差是產生分組的數目。 GROUPING SETS語法可以被認爲是指定的每個分組集的UNION ALL。

例如,讓我們來看看你寫的第一個查詢:

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

在這裏,你已經指定三組:

  1. 的ProductID
  2. 產品名稱
  3. 總計

Thi的查詢是寫下面的代碼相當於:

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和產品名稱計算總計?然後使用第二個。