0

これはおそらく単純ですが、私はそれを見ていません。あなたの助けに感謝します。私はこのようなMSSQLServerのテーブルを持っています

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、任意の数の に対して持っている の数をカウントしますTime

Demo で SQL Fiddle を参照してください。このデモは、varcharあなたが述べたように時間を残します。ただし、データが a の場合datetimeも同様です。

time最終結果が必要なので、列を作成するときは、列selectを 2 回追加する必要がありますtime。私はそれを呼んtime1timetime1これにより、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 に答える