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)
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