3 votes

PIVOT en SQL Server

Je dispose d'une table avec des colonnes :

Anno, Description, Nombre
________________________
2011    Exemple1     12
2013    Exemple2      9
2011    Exemple4      8

......

La valeur dans la colonne Description est dynamique

Je dois produire un tableau comme suit:

Anno Exemple1 Exemple2 Exemple3 Exemple4 ........
--------------------------------------------------    
2011   12         0       0        8     ........
2012    0        23      24       36     ........
......

J'ai créé une vue comme ceci:

Déclarer @cols AS NVARCHAR(Max),
        @query AS NVARCHAR(Max)

Sélectionner @cols = STUFF(( Sélectionner ','+QUOTENAME(Description)
                       FROM mytable
                       GROUP BY Description
                       Order by Description
                       FOR XML PATH ('',TYPE
                       ).value('.','NVARCHAR(Max)'),1,1,'')

SET @query= 'Sélectionner Anno, '+cols+' from
             (Sélectionner Anno, Description, Nombre
              FROM mytable ) as x
              PIVOT
              (
                SUM(Nombre)
                POUR Description in ('+cols+')
               ) pvt'

EXECUTE(@query)

Il renvoie une erreur:

Syntaxe incorrecte près de ','

2voto

Devart Points 52715

Essayez celui-ci -

DECLARE @query NVARCHAR(MAX)

SELECT @query = '
    SELECT Anno, ' + cols + ' 
    FROM (
        SELECT Anno, Description, Number
        FROM dbo.mytable 
    ) x
    PIVOT
    (
    SUM(Number) FOR [Description] IN (' + cols + ')
    ) pvt'
FROM (
    SELECT cols = STUFF((
        SELECT ', [' + [Description] + ']'
        FROM dbo.mytable d
        GROUP BY [Description]
        ORDER BY [Description]
        FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
) t

EXEC sys.sp_executesql @query

1voto

Kenneth Fisher Points 3462

Couple of minor syntax errors. First you are missing a close paren in the FOR XML PATH.

FOR XML PATH ('',TYPE

becomes

FOR XML PATH (''),TYPE

Et deuxièmement, vous stockez la liste des colonnes dans une variable et ne la référencez pas en tant que telle dans votre SQL dynamique. Cela fonctionne correctement.

Déclare @cols AS NVARCHAR(Max),
        @query AS NVARCHAR(Max)

Select @cols = STUFF(( Select ','+QUOTENAME(Description)
                       FROM mytable
                       GROUP BY Description
                       Order by Description
                       FOR XML PATH (''),TYPE
                       ).value('.','NVARCHAR(Max)'),1,1,'')

SET @query= 'Select Anno, '+@cols+', Total from
             (Select Anno, Description, Number, 
                SUM(Number) OVER (PARTITION BY Anno) AS Total
              FROM mytable ) as x
              PIVOT
              (
                SUM(Number)
                FOR Description in ('+@cols+')
               ) pvt'

SQL FIDDLE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X