In SQL ist es oft notwendig, Zeilen und Spalten auszutauschen. Obwohl PIVOT ein geeignetes Tool zu sein scheint, gibt es Situationen, in denen es übermäßig komplex erscheint. Glücklicherweise gibt es einige einfachere Alternativen, um diese Konvertierung zu erreichen.
Wenn PIVOT entmutigend erscheint, können Sie UNION ALL in Kombination mit einer Aggregatfunktion und einer CASE-Anweisung verwenden, um seine Funktionalität zu replizieren:
<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>
Wenn Sie die spezifische Spalte und Farbe kennen, die Sie konvertieren möchten, können Sie sie für die statische Ausführung fest codieren:
<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>
In Fällen, in denen die Anzahl der Spalten und Farben unbekannt ist, kann dynamisches SQL verwendet werden, um die erforderlichen 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 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>
Egal für welche Methode Sie sich entscheiden, die Ergebnisse sind die gleichen:
Das obige ist der detaillierte Inhalt vonWie kann ich Spalten und Zeilen in SQL einfach transponieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!