SQL Server 2012 中动态数据透视 table 的聚合

Aggregation in dynamic pivot table in SQL Server 2012

我在 SQL Server 2012 中有一个 table,它有 500 万行。

Table 视图是这样的:

      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) 会计算每个客户购买的每种产品的数量,但事实并非如此。它说

Invalid Column name CustomerID

相反。

您不能在选择时计算 CustomerId,试试这个:

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'