90 votes

Comprendre la fonction PIVOT en T-SQL

Je suis très novice en matière de SQL.

J'ai une table comme celle-ci :

ID | TeamID | UserID | ElementID | PhaseID | Effort
-----------------------------------------------------
1  |   1    |  1      |   3       |  5     |   6.74
2  |   1    |  1      |   3       |  6     |   8.25
3  |   1    |  1      |   4       |  1     |   2.23
4  |   1    |  1      |   4       |  5     |   6.8
5  |   1    |  1      |   4       |  6     |   1.5

Et on m'a dit d'obtenir des données comme celles-ci

ElementID | PhaseID1 | PhaseID5 | PhaseID6
--------------------------------------------
    3     |   NULL   |   6.74   |   8.25
    4     |   2.23   |   6.8    |   1.5

Je comprends que je dois utiliser la fonction PIVOT. Mais je n'arrive pas à le comprendre clairement. Ce serait une grande aide si quelqu'un pouvait l'expliquer dans le cas ci-dessus (ou toute autre alternative, le cas échéant).

3voto

Easvarr Points 31

Pour définir l'erreur de compatibilité

utilisez ceci avant d'utiliser la fonction pivot

ALTER DATABASE [dbname] SET COMPATIBILITY_LEVEL = 100

0voto

Marukox Points 71

POUR LE PATH XML pourrait ne pas fonctionner sur Microsoft Azure Synapse Serve. Une alternative possible, en suivant l'approche de @Taryn dynamic generated cols, les mêmes résultats sont obtenus en utilisant STRING_AGG .

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)

SELECT @cols = STRING_AGG(QUOTENAME(c.phaseid),', ')
/*OPTIONAL: within group (order by cast(t1.[FLOW_SP_SLPM] as INT) asc)*/
FROM (SELECT phaseid FROM temp
GROUP BY phaseid) c

set @query = 'SELECT elementid,' + @cols + ' from 
             (
                select elementid,
                phaseid,
                effort
                from temp
            ) x
            PIVOT 
            (
                max(effort)
                for phaseid in (' + @cols + ')
            ) p '

execute(@query)

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