0

这可能很简单,但我只是没有看到它。感谢您的帮助。我在 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

在源表中,时间和 itemID 是可变的(并且很多),所以我认为动态枢轴可以解决问题。这可能与枢轴有关吗?如果是这样,怎么做?

4

2 回答 2

4

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

请参阅带有 Demo 的 SQL Fiddle。这个演示留下了varchar你所说的时间。但是,如果数据也是如此,这将起作用datetime

由于您想要time在最终结果中,那么当您select列时,您将需要添加time列两次。我打电话给它time1time。这使您可以time1在 PIVOT 中进行聚合,并且仍然有一个time列用于您的最终产品。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(itemid) 
                    from temp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT customerid, [time], ' + @cols + ' from 
             (
                select customerid, [time] as time1, [time] as [time], itemid
                from temp
            ) x
            pivot 
            (
                count([time1])
                for itemid in (' + @cols + ')
            ) p '

execute(@query)
于 2012-07-09T10:30:54.530 回答
2

方法 #1 -单击此处查看演示

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 - 单击此处查看演示

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
于 2012-07-09T16:57:19.520 回答