ホームページ > データベース > mysql チュートリアル > MySQL の行を複数の列に基づいた列に変換するにはどうすればよいですか?

MySQL の行を複数の列に基づいた列に変換するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-03 07:27:40
オリジナル
279 人が閲覧しました

How to Convert MySQL Rows to Columns Based on Multiple Columns?

複数の列に基づいて行を列に変換する MySQL クエリ

概要:

動的に行から列への変換は、データ操作における一般的なタスクです。この記事では、単一列の変換を処理する以前のソリューションの機能を拡張する、MySQL クエリを使用したソリューションを検討します。

問題:

データと対応する価格を表す複数の行が注文と品目ごとに整理されたテーブル。目標は、このデータを、各注文が列として表され、各商品が行として表され、対応する価格が表示される表に変換することです。

解決策:

この複数列の変換を実現するには、2 段階のプロセスを採用します。

ステップ 1: ピボットを解除するデータ

まず、UNION ALL を使用してデータをアンピボットし、注文と商品の組み合わせごとに複数の行を作成します。これにより、次のステップでデータをより簡単に操作できるようになります。

1

2

3

4

5

SELECT id, CONCAT('order', `order`) col, data value

FROM tableA

UNION ALL

SELECT id, CONCAT('item', item) col, price value

FROM tableA;

ログイン後にコピー

ステップ 2: アンピボットされたデータのピボット

データがアンピボットされたら、ピボットしますCASE ステートメントで集計関数を使用して列に戻します。これにより、ピボットされていない行が ID でグループ化され、対応する値が適切な列に割り当てられます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

SELECT

  id,

  MAX(CASE WHEN col = 'order1' THEN value END) ORDER1,

  MAX(CASE WHEN col = 'order2' THEN value END) ORDER2,

  MAX(CASE WHEN col = 'order3' THEN value END) ORDER3,

  MAX(CASE WHEN col = 'item1' THEN value END) ITEM1,

  MAX(CASE WHEN col = 'item2' THEN value END) ITEM2,

  MAX(CASE WHEN col = 'item3' THEN value END) ITEM3

FROM

(

  SELECT id, CONCAT('order', `order`) col, data value

  FROM tableA

  UNION ALL

  SELECT id, CONCAT('item', item) col, price value

  FROM tableA

) d

GROUP BY id;

ログイン後にコピー

動的クエリ生成:

注文数が異なるテーブルを処理するにはとアイテムを使用すると、準備されたクエリを使用して動的にクエリを生成できます。ステートメント。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

SET @sql = NULL;

SELECT

  GROUP_CONCAT(DISTINCT

    CONCAT(

      'MAX(CASE WHEN col = ''',

      col,

      ''' THEN value END) AS `',

      col, '`')

  ) INTO @sql

FROM

(

  SELECT CONCAT('order', `order`) col

  FROM tableA

  UNION ALL

  SELECT CONCAT('item', `item`) col

  FROM tableA

)d;

 

SET @sql = CONCAT('SELECT id, ', @sql, '

                  FROM

                  (

                    SELECT id, CONCAT(''order'', `order`) col,  data value

                    FROM tableA

                    UNION ALL

                    SELECT id, CONCAT(''item'', item) col, price value

                    FROM tableA

                  ) d

                  GROUP BY id');

 

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

ログイン後にコピー

結果:

結果のテーブルは、各注文を列として、各アイテムを行として、データを簡潔に表現します。対応する価格。

以上がMySQL の行を複数の列に基づいた列に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート