Heim >Datenbank >MySQL-Tutorial >Wie transponiert man Spalten und Zeilen in SQL effizient?

Wie transponiert man Spalten und Zeilen in SQL effizient?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-23 11:06:09298Durchsuche

How to Efficiently Transpose Columns and Rows in SQL?

Einfache Möglichkeit, SQL-Zeilen und -Spalten zu konvertieren

Obwohl die PIVOT-Funktion von SQL für die Spalten-Spalten-Konvertierung geeignet zu sein scheint, kann ihre Komplexität unerschwinglich sein. Wenn Sie dies einfacher erreichen möchten, ziehen Sie die folgenden Alternativen in Betracht:

Verwenden Sie UNION ALL, Aggregatfunktionen und CASE-Anweisungen

Diese Methode verwendet UNION ALL, um die Daten zu erweitern, und verwendet dann Aggregatfunktionen und CASE-Anweisungen zum Pivotieren:

<code class="language-sql">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</code>

Statische Dekonstruktion und Perspektive

Wenn Sie den Wert kennen, den Sie konvertieren möchten, verwenden Sie fest codierte Werte für die Destrukturierung und Pivotierung:

<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)
  ) AS unpiv
) AS src
PIVOT
(
  SUM(value)
  FOR color IN ([Red], [Green], [Blue])
) AS piv</code>

Dynamische Perspektive

Verwenden Sie für eine unbekannte Anzahl von Spalten und Farben dynamisches SQL, um dekonstruierte und Pivot-Listen zu generieren:

<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 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)</code>

Alle drei Methoden führen zu folgenden Ergebnissen:

NAME RED GREEN BLUE
Eric 3 5 1
John 5 4 2
Paul 1 8 2
Tim 1 3 9

Das obige ist der detaillierte Inhalt vonWie transponiert man Spalten und Zeilen in SQL effizient?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn