MySQL Pivot: 列を行に変換
MySQL では、データをより適切に表示するために列を行に変換してピボット テーブルを生成する必要があります。たとえば、異なる月 (1 月、2 月など) のデータを表す複数の列 (col1、col2 など) を含むテーブルについて考えてみましょう。
要件: ピボット テーブル形式でデータを表示するレポートを作成します。各行は元のテーブルの列を表し、各列は異なる月を表します。
データ拡張:
MySQL には、データを展開する (列を行に変換する) ための組み込み関数がありません。ただし、これは UNION ALL クエリで実現できます:
<code class="language-sql">SELECT id, month, col1 AS value, 'col1' AS descrip FROM yourtable UNION ALL SELECT id, month, col2 AS value, 'col2' AS descrip FROM yourtable UNION ALL SELECT id, month, col3 AS value, 'col3' AS descrip FROM yourtable UNION ALL SELECT id, month, col4 AS value, 'col4' AS descrip FROM yourtable</code>
結果:
このクエリはデータを次の形式に変換します:
ID | MONTH | VALUE | DESCRIP |
---|---|---|---|
101 | Jan | A | col1 |
101 | Jan | B | col2 |
101 | Jan | NULL | col3 |
101 | Jan | B | col4 |
102 | Feb | C | col1 |
102 | Feb | A | col2 |
102 | Feb | G | col3 |
102 | Feb | E | col4 |
ピボット:
データが展開されたら、集計関数を使用して目的のピボット テーブル形式に変換できます。次のクエリは、CASE ステートメントを使用してデータを各列 (説明) ごとにグループ化し、1 月と 2 月の値を表示します。
<code class="language-sql">SELECT descrip, MAX(CASE WHEN month = 'Jan' THEN value ELSE 0 END) AS Jan, MAX(CASE WHEN month = 'Feb' THEN value ELSE 0 END) AS Feb FROM ( SELECT id, month, col1 AS value, 'col1' AS descrip FROM yourtable UNION ALL SELECT id, month, col2 AS value, 'col2' AS descrip FROM yourtable UNION ALL SELECT id, month, col3 AS value, 'col3' AS descrip FROM yourtable UNION ALL SELECT id, month, col4 AS value, 'col4' AS descrip FROM yourtable ) src GROUP BY descrip</code>
結果:
このクエリは、必要なピボット テーブル形式を生成します:
以上がMySQL でデータをピボットする方法: 列を行に変換する?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。