moyen facile de convertir les rangs et colonnes SQL
]Bien que la fonction de pivot de SQL semble convenir à la conversion de lignes et de colonnes, sa complexité peut être prohibitive. Si vous souhaitez y parvenir plus facilement, considérez l'alternative suivante:
Utiliser Union All, les fonctions agrégées et les instructions de cas
Cette méthode utilise Union all pour étendre les données, puis utilise la fonction agrégée et l'instruction de cas pour la perspective:
SELECT name,
SUM(CASE WHEN color = 'Red' THEN value ELSE 0 END) AS Red,
SUM(CASE WHEN color = 'Green' THEN value ELSE 0 END) AS Green,
SUM(CASE WHEN color = 'Blue' THEN value ELSE 0 END) AS Blue
FROM
(
SELECT color, Paul AS value, 'Paul' AS name
FROM yourTable
UNION ALL
SELECT color, John AS value, 'John' AS name
FROM yourTable
UNION ALL
SELECT color, Tim AS value, 'Tim' AS name
FROM yourTable
UNION ALL
SELECT color, Eric AS value, 'Eric' AS name
FROM yourTable
) AS src
GROUP BY name
déconstruction statique et perspective
]Si vous connaissez la valeur que vous souhaitez convertir, utilisez des valeurs codées en dur pour la déconstruction et la perspective:
SELECT name, [Red], [Green], [Blue]
FROM
(
SELECT color, name, value
FROM yourTable
UNPIVOT
(
value FOR name IN (Paul, John, Tim, Eric)
) AS unpiv
) AS src
PIVOT
(
SUM(value)
FOR color IN ([Red], [Green], [Blue])
) AS piv
perspective dynamique
]Pour un nombre inconnu de colonnes et de couleurs, utilisez Dynamic SQL pour générer une liste déconstruite et en perspective:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot AS NVARCHAR(MAX)
SELECT @colsUnpivot = STUFF((SELECT ',' QUOTENAME(C.name)
FROM sys.columns AS C
WHERE C.object_id = OBJECT_ID('yourtable') AND
C.name 'color'
FOR XML PATH('')), 1, 1, '')
SELECT @colsPivot = STUFF((SELECT ','
QUOTENAME(color)
FROM yourtable AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '')
SET @query = 'SELECT name, ' @colsPivot '
FROM (
SELECT color, name, value
FROM yourtable
UNPIVOT
(
value FOR name IN (' @colsUnpivot ')
) AS unpiv
) AS src
PIVOT
(
SUM(value)
FOR color IN (' @colsPivot ')
) AS piv'
EXEC(@query)
Les trois méthodes produisent les résultats suivants:
red | verd &&&] 1 | ||
---|---|---|---|
4 | 2 | 8 | |
9 |
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3