Sql server SQL Server 2012中动态透视表中的聚合
我在SQL Server 2012中有一个表,它有500万行 表视图如下所示: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
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?