Tableau croisé dynamic avec deux colonnes d'id

C'est probablement simple mais je ne le vois pas, votre aide est appréciée J'ai une table dans MS SQL Server qui ressemble à ceci

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 

Je veux finir avec une table qui a chaque client, l'horodatage et le nombre d'articles achetés pendant cette horodatage, qui ressemble à ceci

 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 

Dans la table source, le time et l'itemID sont variables (et abondants), donc je pense qu'un pivot dynamic fera l'affaire. Est-ce possible de faire avec le pivot? Si c'est le cas, comment?

Vous pouvez le faire avec un PIVOT dynamic. Cela countra le nombre de ItemId que vous avez pour n'importe quel nombre de Time .

Voir un Fiddle SQL avec une démo . Cette démo laisse l'heure comme un varchar comme vous l'avez dit. Mais cela fonctionnera si datatables sont également datetime .

Puisque vous voulez du time dans le résultat final, lorsque vous select les colonnes, vous devez append deux time colonne d' time . Je l'ai appelé time1 et time . Cela vous permet d'agréger sur time1 dans le PIVOT et d'avoir toujours une colonne de time pour votre produit final.

 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) 

Approche # 1 – Cliquez ici pour voir la démo

 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) 

Approche # 2 – Cliquez ici pour voir la démo

 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