ホームページ > データベース > mysql チュートリアル > ネイティブ PIVOT 関数を使用せずに MySQL でデータを動的にピボットするにはどうすればよいですか?

ネイティブ PIVOT 関数を使用せずに MySQL でデータを動的にピボットするにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-06 07:24:39
オリジナル
908 人が閲覧しました

How can I dynamically pivot data in MySQL without a native PIVOT function?

MySQL の動的ピボット

リレーショナル データベースには、製品の部品に関する情報を保持する「Parts」というテーブルがあります。パーツ ID、パーツ タイプ、および関連する製品 ID。テーブル構造は次のようになります。

Parts
--------------------------------------
part_id | part_type | product_id
--------------------------------------
1        | A        | 1
2        | B        | 1
3        | A        | 2
4        | B        | 2
5        | A        | 3
6        | B        | 3
ログイン後にコピー

目的:

私たちの目標は、このデータをピボットされた形式に変換してテーブルを作成するクエリを構築することです。一意の製品 ID ごとに 1 行があり、列は「A」および「B」タイプの対応する部品 ID を表します。目的の出力テーブルは次のようになります。

Product_ID | Part_A_ID | Part _B_ID
----------------------------------------
1           | 1         | 2
2           | 3         | 4
3           | 5         | 6
ログイン後にコピー

解決策:

残念ながら、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;
ログイン後にコピー

このクエリは、「Parts」テーブル内の固有のパーツ タイプに基づいて SQL ステートメントを動的に構築します。次に、準備されたステートメントを使用して生成された SQL ステートメントを実行し、大規模な結果セットによる潜在的なパフォーマンスの問題を効率的に処理します。

列数が制限された静的ソリューションの代替:

部品タイプの数が限られている場合は、静的バージョンのクエリを使用できます。

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
ログイン後にコピー

この代替案は次のとおりです。部品種類が決まっていて少ない場合におすすめです。

以上がネイティブ PIVOT 関数を使用せずに MySQL でデータを動的にピボットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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