具有两个id列的动态数据透视表

时间:2012-07-09 09:21:00

标签: sql sql-server sql-server-2008 pivot

这可能很简单,但我只是没有看到它。感谢您的帮助。我在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是可变的(并且很丰富),所以我认为动态数据透视可以解决这个问题。这可能与枢轴有关吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:4)

您可以使用动态PIVOT执行此操作。这将计算任意数量ItemId的{​​{1}}个数。

查看SQL Fiddle with a Demo。此演示将时间保留为您所说的Time。但是,如果数据也是varchar,这将有效。

由于您希望在最终结果中使用datetime,因此当您time列时,您需要将select列添加两次。我称之为timetime1。这样,您就可以在PIVOT中的time上进行汇总,并为最终产品提供time1列。

time

答案 1 :(得分:2)

方法#1 - Click here to see Demo

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)

方法#2 - Click here to see Demo

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