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

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

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-23 09:47:14737ブラウズ

How Can I Efficiently Transpose Columns and Rows in SQL?

SQL の列と行の転置: 実践ガイド

SQL では、テーブルの向きを垂直 (列) から水平 (行) に、またはその逆に変換するなど、データの転置が必要になることがよくあります。 PIVOT コマンドは存在しますが、面倒な場合があります。 このガイドでは、より簡単な代替案を検討します。

方法 1: UNION ALL、Aggregate、CASE ステートメント

このアプローチでは、UNION ALL を使用してピボットを解除し、次に集約関数 (ここでは SUM) と 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>

方法 2: 静的な 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>

方法 3: 変数列の動的ピボット

動的な列数と色を扱う場合、動的 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 でのデータ転置に対する多用途なアプローチを提供し、さまざまなデータ操作のニーズに適応します。

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

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