ホームページ >データベース >mysql チュートリアル >SQL で列と行を簡単に転置するにはどうすればよいですか?
SQL では、多くの場合、行と列を交換する必要があります。 PIVOT は適切なツールのように見えますが、過度に複雑に見える状況もあります。幸いなことに、この変換を実現するためのより簡単な代替手段がいくつかあります。
PIVOT が難しいと思われる場合は、UNION ALL を集計関数および CASE ステートメントと組み合わせて使用して、その機能を複製できます。
<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>
変換したい特定の列と色がわかっている場合は、静的実行用にハードコーディングできます。
<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>
列と色の数が不明な場合は、動的 SQL を使用して必要なリストを生成できます。
<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>
どの方法を選択しても、結果は同じです:
| 3 | 5 |
| ジョン | 4 |
| ポール | 8 |
| ティム | 3 |
以上がSQL で列と行を簡単に転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。