"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como transpor com eficiência colunas e linhas no SQL?

Como transpor com eficiência colunas e linhas no SQL?

Postado em 2025-03-25
Navegar:919

How to Efficiently Transpose Columns and Rows in SQL?

maneira fácil de converter ranks sql e colunas

]

Embora a função pivô do SQL pareça ser adequada para conversão de linha e coluna, sua complexidade pode ser proibitiva. Se você deseja conseguir isso de uma maneira mais fácil, considere a seguinte alternativa:

use a Union all, funções agregadas e instruções de caso

Este método usa a Union all para expandir os dados e, em seguida, usa a função agregada e a instrução CASE para perspectiva:

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

desconstrução e perspectiva estática

]

Se você conhece o valor que deseja converter, use valores codificados para desconstrução e perspectiva:

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

perspectiva dinâmica

]

Para um número desconhecido de colunas e cores, use SQL dinâmico para gerar uma lista desconstruída e de perspectiva:

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)

Todos os três métodos produzem os seguintes resultados:

name RED GREEN 1
Blue
eric 3 5
] Paul 1 8 [&&&s
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3