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

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

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-23 11:01:12743ブラウズ

How to 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 メソッド

変換する列の値がわかっている場合は、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>

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

以上がSQL で列と行を簡単に転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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