2015-02-09 75 views
1

我有一個SQL Server 2012中有500萬行的表。SQL Server 2012動態數據透視表中的聚合

表的看法是這樣的:

 CustomerID  ProdID FavouriteProduct 
      1    A    A 
      1    A    A 
      1    A    A 
      1    B    A 
      1    A    A 
      1    A    A 
      1    A    A 
      1    B    A 
      2    A    C 
      2    AN    C 
      2    G    C 
      2    C    C 
      2    C    C 
      2    F    C 
      2    D    C 
      2    C    C 

正如你可以看到有這麼多不同的產品。

我已經寫了一個查詢:

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT 
    @ColumnName = ISNULL(@ColumnName + ',','') + QUOTENAME(prodID) 
FROM 
    (SELECT DISTINCT ProdID FROM Table) AS Prods 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
      N'SELECT CustomerID, ' + @ColumnName + ' 
      FROM table 
      PIVOT(count(CustomerID) 
      FOR ProdID IN (' + @ColumnName + ')) AS PVTTable' 

--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

通常情況下,我希望count(*)Count(SubID)也要算每個客戶各買產品的數量,但事實並非如此。它說

無效列名客戶ID

代替。

+0

表中還有另一列表示每次購買產品的數量。但是當我把總和(數量)進行聚合。它對於所有不正確的產品返回1。 @ t-clausen.dk – Ariox66 2015-02-09 13:52:05

+0

我覺得你用count而不是sum。另外我想這是你需要的SELECT DISTINCT prodID FROM Table而不是DISTINCT City – 2015-02-09 13:55:58

+0

真正的表是完全不同的。我將名稱更改爲客戶和產品,以使其更簡單。我相信我寫了總和(數量)@ t-clausen.dk – Ariox66 2015-02-09 14:00:43

回答

2

,而選擇它你不能指望在客戶,試試這個來代替:

SET @DynamicPivotQuery = 
     N'SELECT CustomerID, ' + @ColumnName + ' 
     FROM table 
     PIVOT(count(FavouriteProduct) 
     FOR ProdID IN (' + @ColumnName + ')) AS PVTTable' 

你需要列數和CustomerId是不允許的,因爲你選擇它。如果FavouriteProduct失敗,我建議你僞造一個列或找到另一個列。

由於你有更多的列比描述,我修改了查詢。試試這個:

SET @DynamicPivotQuery = 
    N'SELECT CustomerID, ' + @ColumnName + ' 
    FROM 
     (SELECT CustomerID, FavouriteProduct, ProdID FROM table) x 
    PIVOT(count(FavouriteProduct) 
    FOR ProdID IN (' + @ColumnName + ')) AS PVTTable' 
+0

我可以計算他們購買該產品的日期? – Ariox66 2015-02-09 13:24:44

+0

是的,你可以,但它會計算所有的日期,而不是截然不同的日期,它也會將空值計爲0. – 2015-02-09 13:29:30

+0

我希望它計算每個客戶購買的所有產品。所以計算所有日期將是好的。但它只返回1,雖然有很多客戶多次購買產品。 – Ariox66 2015-02-09 13:47:04