Pivots SQL Server: affichage des valeurs de ligne dans les en-têtes de colonne

J'ai une table (items) qui est dans le format suivant:

ITEMNO | WEEKNO | VALUE A1234 | 1 | 805 A2345 | 2 | 14.50 A3547 | 2 | 1396.70 A2208 | 1 | 17.65 A4326 | 6 | 19.99 

C'est un tableau qui montre la valeur des ventes d'articles dans une semaine donnée.

Les résultats ou ce que je veux afficher dans un format de tableau est le numéro d'article dans une rangée suivi par des colonnes pour chaque semaine contenant les valeurs, par exemple

 ITEMNO | WK1 | WK2 | WK3 | WK4 | WK5 ...etc up to 52 A1234 | 805 | 345 | 234 | 12 | 10 ...etc up to 52 A2345 | 23 | 12 | 456 | 34 | 99 ...etc up to 52 A3456 | 234 | 123 | 34 | 25 | 190 ...etc up to 52 

Bien que j'en ai 52 … donc je n'ai que des données pour jusqu'à la semaine9 mais ça va augmenter avec le time.

Donc, ce que je cherche à afficher, c'est la valeur du numéro de semaine comme en-tête de colonne.

Est-ce possible … même si je suis tenté de saisir datatables et de les afficher correctement via le code / (asp.net) mais je me demandais s'il n'y avait pas d'affichage comme ça en SQL?

Est-ce que quelqu'un sait ou pense que cela pourrait être le meilleur moyen?

Il y a deux façons de le faire avec SQL statique et SQL dynamic:

Pivot statique:

 SELECT P.ItemNo, IsNull(P.[1], 0) as Wk1, IsNull(P.[2], 0) as Wk2 , IsNull(P.[3], 0) as Wk3, IsNull(P.[4], 0) as Wk4 , IsNull(P.[5], 0) as Wk5, IsNull(P.[6], 0) as Wk6 , IsNull(P.[7], 0) as Wk7, IsNull(P.[8], 0) as Wk8 , IsNull(P.[9], 0) as Wk9 FROM ( SELECT ItemNo, WeekNo, [Value] FROM dbo.Items ) I PIVOT ( SUM([Value]) FOR WeekNo IN ([1], [2], [3], [4], [5], [6], [7], [8], [9]) ) as P 

Pivot dynamic:

 DECLARE @cols AS NVARCHAR(MAX), @y AS INT, @sql AS NVARCHAR(MAX); -- Construct the column list for the IN clause SET @cols = STUFF( (SELECT N',' + QUOTENAME(w) AS [text()] FROM (SELECT DISTINCT WeekNo AS W FROM dbo.Items) AS W ORDER BY W FOR XML PATH('')), 1, 1, N''); -- Construct the full T-SQL statement -- and execute dynamically SET @sql = N'SELECT * FROM (SELECT ItemNo, WeekNo, Value FROM dbo.Items) AS I PIVOT(SUM(Value) FOR WeekNo IN(' + @cols + N')) AS P;'; EXEC sp_executesql @sql; GO 

Peut-être quelque chose comme ça:

Données de test

 CREATE TABLE #tbl ( ITEMNO VARCHAR(100), WEEKNO INT, VALUE FLOAT ) INSERT INTO #tbl VALUES ('A1234',1,805), ('A2345',2,14.50), ('A3547',2,1396.70), ('A2208',1,17.65), ('A4326',6,19.99) 

Colonnes de la semaine

 DECLARE @cols VARCHAR(MAX) ;WITH Nbrs ( n ) AS ( SELECT 1 UNION ALL SELECT 1 + n FROM Nbrs WHERE n < 52 ) SELECT @cols = COALESCE(@cols + ','+QUOTENAME('WK'+CAST(n AS VARCHAR(2))), QUOTENAME('WK'+CAST(n AS VARCHAR(2)))) FROM Nbrs 

Juste les semaines incluses

 DECLARE @cols VARCHAR(MAX) ;WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY WEEKNO ORDER BY WEEKNO) AS RowNbr, WEEKNO FROM #tbl ) SELECT @cols = COALESCE(@cols + ','+QUOTENAME('WK'+CAST(WEEKNO AS VARCHAR(2))), QUOTENAME('WK'+CAST(WEEKNO AS VARCHAR(2)))) FROM CTE WHERE CTE.RowNbr=1 

Pivot dynamic

 DECLARE @query NVARCHAR(4000)= N'SELECT * FROM ( SELECT tbl.ITEMNO, ''WK''+CAST(tbl.WEEKNO AS VARCHAR(2)) AS WEEKNO, tbl.VALUE FROM #tbl as tbl ) AS p PIVOT ( SUM(VALUE) FOR WEEKNO IN ('+@cols+') ) AS pvt' EXECUTE(@query) 

Déposez la table temporaire

 DROP TABLE #tbl 

Utilisez Pivot , bien que tout un peu de code .. Si vous créez un rapport dans les services de reporting, vous pouvez utiliser la masortingce ..

Suivez le walkthrogh ci-dessous qui explique clairement

http://www.tsqltutorials.com/pivot.php

Vous pouvez utiliser PIVOT si vous voulez le faire directement en sql.

Il peut être plus efficace d'utiliser SQL Server pour cela, par opposition au client en fonction de la taille des données et de l'agrégation.