Maison >base de données >tutoriel mysql >Comment puis-je transposer efficacement des colonnes et des lignes dans SQL ?

Comment puis-je transposer efficacement des colonnes et des lignes dans SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-23 09:47:14736parcourir

How Can I Efficiently Transpose Columns and Rows in SQL?

Transposition de colonnes et de lignes SQL : un guide pratique

SQL nécessite souvent de transposer les données – en convertissant l'orientation du tableau de verticale (colonnes) à horizontale (lignes) ou inversement. Bien que la commande PIVOT existe, elle peut être fastidieuse. Ce guide explore des alternatives plus simples.

Méthode 1 : déclaration UNION ALL, Aggregate et CASE

Cette approche utilise UNION ALL pour annuler le pivotement, puis une fonction d'agrégation (ici, SUM) et une instruction CASE pour repivoter :

<code class="language-sql">select name,
  sum(case when color = 'Red' then value else 0 end) Red,
  sum(case when color = 'Green' then value else 0 end) Green,
  sum(case when color = 'Blue' then value else 0 end) Blue
from
(
  select color, Paul value, 'Paul' name
  from yourTable
  union all
  select color, John value, 'John' name
  from yourTable
  union all
  select color, Tim value, 'Tim' name
  from yourTable
  union all
  select color, Eric value, 'Eric' name
  from yourTable
) src
group by name</code>

Méthode 2 : UNPIVOT et PIVOT statiques

Connaître le nombre de colonnes à transformer permet d'avoir une solution statique UNPIVOT et PIVOT :

<code class="language-sql">select name, [Red], [Green], [Blue]
from
(
  select color, name, value
  from yourtable
  unpivot
  (
    value for name in (Paul, John, Tim, Eric)
  ) unpiv
) src
pivot
(
  sum(value)
  for color in ([Red], [Green], [Blue])
) piv</code>

Méthode 3 : Pivot dynamique pour les colonnes variables

Lorsqu'il s'agit d'un nombre dynamique de colonnes et de couleurs, le SQL dynamique offre une solution :

<code class="language-sql">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 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+')
        ) unpiv
      ) src
      pivot
      (
        sum(value)
        for color in ('+@colsPivot+')
      ) piv'

exec(@query)</code>

Ces méthodes offrent des approches polyvalentes de transposition de données en SQL, s'adaptant aux divers besoins de manipulation de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn