这可能很简单,但我只是没有看到它。感谢您的帮助。我在MS SQLServer中有一个看起来像这样的表
CustomerID Time ItemID
1 2008-10-07 06:32:53:00.000 87432
1 2008-10-07 06:32:53:00.000 26413
2 2010-06-23 03:45:10:00.000 6312
2 2011-09-14 07:36:03:00.000 87432
2 2011-09-14 07:36:03:00.000 87432
我想最终得到一张表格,其中包含每个客户,时间戳以及在该时间戳期间购买的商品的数量,如下所示
CustomerID Time 87432 26413 6312
1 2008-10-07 06:32:53:00.000 1 1 0
2 2010-06-23 03:45:10:00.000 0 0 1
2 2011-09-14 07:36:03:00.000 2 0 0
在源表中,time和itemID是可变的(并且很丰富),所以我认为动态数据透视可以解决这个问题。这可能与枢轴有关吗?如果是这样,怎么样?
答案 0 :(得分:4)
您可以使用动态PIVOT执行此操作。这将计算任意数量ItemId
的{{1}}个数。
查看SQL Fiddle with a Demo。此演示将时间保留为您所说的Time
。但是,如果数据也是varchar
,这将有效。
由于您希望在最终结果中使用datetime
,因此当您time
列时,您需要将select
列添加两次。我称之为time
和time1
。这样,您就可以在PIVOT中的time
上进行汇总,并为最终产品提供time1
列。
time
答案 1 :(得分:2)
Declare @ItemIDs varchar(1000) = ''
Declare @Query varchar(8000) = ''
Select @ItemIDs = ISNULL(QuoteName(Convert(varchar, ItemID)) + ',', '')
+ @ItemIDs
From
(
Select distinct ItemID From #MyTable
)K
SET @ItemIDs = SUBSTRING(@ItemIDs,0,len(@ItemIDs))
SET @Query = 'Select CustomerID, [Time],' +
@ItemIDs + ' From
(
Select CustomerID, [Time], ItemID from #MyTable
)K Pivot
(
count(ItemID) FOR ItemID IN (' + @ItemIDs + ')
) AS pvt'
EXEC(@Query)
Select CustomerID, [Time], [87432] as [87432],
[26413] as [26413], [6312] as [6312] From
(
Select CustomerID, [Time], ItemID from #MyTable
)K Pivot
(
count(ItemID) FOR ItemID IN ([87432] , [26413],[6312])
) AS pvt