Sql server SQL Server 2012中动态透视表中的聚合

Sql server SQL Server 2012中动态透视表中的聚合,sql-server,sql-server-2012,pivot,Sql Server,Sql Server 2012,Pivot,我在SQL Server 2012中有一个表,它有500万行 表视图如下所示: CustomerID ProdID FavouriteProduct 1 A A 1 A A 1 A A 1 B

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

表视图如下所示:

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

列名称CustomerID无效


取而代之。

在选择CustomerId时,您不能对其进行计数,请尝试以下操作:

SET @DynamicPivotQuery = 
       N'SELECT CustomerID, ' + @ColumnName + '
         FROM table 
         PIVOT(count(FavouriteProduct) 
         FOR ProdID IN (' + @ColumnName + ')) AS PVTTable'
SET @DynamicPivotQuery = 
   N'SELECT CustomerID, ' + @ColumnName + '
     FROM 
       (SELECT CustomerID, FavouriteProduct, ProdID FROM table) x
     PIVOT(count(FavouriteProduct) 
     FOR ProdID IN (' + @ColumnName + ')) AS PVTTable'
您需要一列进行计数,并且由于您正在选择CustomerId,因此不允许使用CustomerId。如果FavoriteProduct失败,我建议您伪造一个专栏或查找另一个专栏

因为您的列比描述的多,所以我修改了查询。请尝试以下方法:

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

我可以计算他们购买该产品的日期吗?可以,但它将计算所有日期,而不是不同的日期,它还将null值计算为0。我希望它计算每个客户购买的所有产品。所以数一数所有的日期就可以了。但它只返回1,尽管有许多客户多次购买产品。因为它是pivot,所以它的语法略有不同。表中还有一列表示每次购买的产品数量。但当我把总和(数量)加起来时。对于所有不正确的产品,它返回1。@我想你用了计数而不是总和。另外,我认为这就是您需要从表中选择不同的prodID而不是不同的city实际的表是完全不同的。我将名称改为“客户”和“产品”,以使其更简单。我肯定我写了sum(quantity)@t-clausen.dkI尝试了一个新的答案。如果不是这样,我就放弃issue@Ariox66根据您的样本数据,您希望最终结果是什么?另外,为什么不先尝试通过静态方法(硬编码值)编写查询,然后再将其转换为动态SQL?