ホームページ >データベース >mysql チュートリアル >SQL で列と行を簡単に転置するにはどうすればよいですか?

SQL で列と行を簡単に転置するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-23 10:57:10936ブラウズ

How Can I Easily Transpose Columns and Rows in SQL?

SQL の列と行の転置を簡単に実装

SQL では、多くの場合、行と列を交換する必要があります。 PIVOT は適切なツールのように見えますが、過度に複雑に見える状況もあります。幸いなことに、この変換を実現するためのより簡単な代替手段がいくつかあります。

UNION ALL、集計関数、CASE ステートメントを使用する

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>

静的な値を使用した UNPIVOT と PIVOT

変換したい特定の列と色がわかっている場合は、静的実行用にハードコーディングできます。

<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>

動的 UNPIVOT と PIVOT を使用して不明な値を処理します

列と色の数が不明な場合は、動的 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。