ホームページ > データベース > mysql チュートリアル > 集計関数と CASE ステートメントを使用して MySQL でデータを動的にピボットする方法

集計関数と CASE ステートメントを使用して MySQL でデータを動的にピボットする方法

Mary-Kate Olsen
リリース: 2025-01-06 07:56:43
オリジナル
596 人が閲覧しました

How to Dynamically Pivot Data in MySQL Using Aggregate Functions and CASE Statements?

MySQL の集計関数と CASE ステートメントを使用してデータを動的にピボットする

次のスキーマを持つ製品パーツのテーブルを考えてみましょう:

CREATE TABLE Parts (
    part_id INT NOT NULL,
    part_type CHAR(1) NOT NULL,
    product_id INT NOT NULL,
    PRIMARY KEY (part_id)
);
ログイン後にコピー

サンプルデータ:

INSERT INTO Parts (part_id, part_type, product_id) VALUES
(1, 'A', 1),
(2, 'B', 1),
(3, 'A', 2),
(4, 'B', 2),
(5, 'A', 3),
(6, 'B', 3);
ログイン後にコピー

目標は、このデータをピボットして製品パーツを列として表すテーブルにすることです:

CREATE TABLE PivotedParts (
    product_id INT NOT NULL,
    part_A_id INT,
    part_B_id INT,
    PRIMARY KEY (product_id)
);
ログイン後にコピー

動的ピボット ソリューション:

MySQL には組み込みの PIVOT 関数がありませんが、動的ソリューションは次のとおりです。集計関数と CASE ステートメントを使用して実現します:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when part_type = ''',
      part_type,
      ''' then part_id end) AS part_',
      part_type, '_id'
    )
  ) INTO @sql
FROM
  Parts;

SET @sql = CONCAT('SELECT product_id, ', @sql, ' 
                  FROM Parts 
                   GROUP BY product_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
ログイン後にコピー

出力例:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
ログイン後にコピー
ログイン後にコピー

静的ピボット ソリューション (限られた数の列の場合) :

列の数が制限された静的ピボット ソリューションの場合、次のようになります。使用できるクエリ:

SELECT product_id,
  max(case when part_type ='A' then part_id end) as part_A_id,
  max(case when part_type ='B' then part_id end) as part_B_id
FROM Parts
GROUP BY product_id;
ログイン後にコピー

出力:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
ログイン後にコピー
ログイン後にコピー

以上が集計関数と CASE ステートメントを使用して MySQL でデータを動的にピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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