Heim >Datenbank >MySQL-Tutorial >Wie transponiert man Spalten und Zeilen in SQL effizient?
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!