
MySQL の動的ピボット
MySQL では、テーブルに正規化された形式のデータが含まれることが多く、より多くのユーザーがデータを取得するには複雑なクエリが必要になります。フレンドリーなフォーマット。このような変換の 1 つは、列が行に変換されるピボットです。
製品部品 (part_id) を製品タイプ (part_type) および製品 ID (product_id) に関連付ける、「Parts」のようなテーブルについて考えてみましょう。このテーブルをピボットして、さまざまなパーツ タイプの各製品のパーツ ID を示す新しいテーブルを作成したいと考えています。
MySQL には専用の PIVOT 関数がないため、代替手法を使用する必要があります。解決策の 1 つは、集計関数と CASE ステートメントを使用することです。動的ピボットの場合、プリペアド ステートメントを活用できます。
動的ピボット クエリ
次のクエリは、動的 SQL を使用して「Parts」テーブルをピボットします:
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;このクエリは、テーブル内に存在する個別のパーツ タイプに基づいて SQL ステートメントを動的に生成し、実行します。パフォーマンスを向上させるために準備されたステートメントを使用します。
結果の例
結果のテーブルは次の形式になります:
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
このクエリはパーツ タイプを手動で指定し、ピボット テーブルを生成します。
以上が準備されたステートメントを使用して MySQL で動的ピボットを実行する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。