ホームページ > データベース > mysql チュートリアル > MySQL で動的列を行にアンピボットするにはどうすればよいですか?

MySQL で動的列を行にアンピボットするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-10 07:46:09
オリジナル
917 人が閲覧しました

How to Unpivot Dynamic Columns into Rows in MySQL?

動的列からの行の作成

データ管理の領域では、多くの場合、列と行の操作が必要になります。この質問は、複数の動的列を、特定の基準を含む行を含む新しいテーブルに変換するという特定のタスクについて詳しく掘り下げています。

指定された例は、Table_1 のアンピボットを示し、結果として Expected_Result_Table になります。主な違いは、Expected_Result_Table ではゼロ以外の各値が個別の行に表示されることです。

MySQL には直接 UNPIVOT 関数がありませんが、この制限は UNION ALL ステートメントを使用して克服できます。基本的なアプローチには、列ごとに個別の SELECT ステートメントを作成し、ID、「word」値として列名、「qty」値として列値を選択することが含まれます。これらの SELECT ステートメントは、UNION ALL を使用して結合されます。

例:

SELECT id, 'abc' AS word, abc AS qty
FROM yt
WHERE abc > 0
UNION ALL
SELECT id, 'brt', brt
FROM yt
WHERE brt > 0
ログイン後にコピー

このアプローチは、動的列を扱う場合にはさらに複雑になります。これに対処するには、準備されたステートメントを使用できます。これらにより、メタデータに基づいて SQL ステートメントを動的に生成できます。

次のコード スニペットは、そのようなアプローチを示しています。

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select id, ''',
      c.column_name,
      ''' as word, ',
      c.column_name,
      ' as qty 
      from yt 
      where ',
      c.column_name,
      ' > 0'
    ) SEPARATOR ' UNION ALL '
  ) INTO @sql
FROM information_schema.columns c
WHERE c.table_name = 'yt'
  AND c.column_name NOT IN ('id')
ORDER BY c.ordinal_position;

SET @sql 
  = CONCAT('select id, word, qty
           from
           (', @sql, ') x  order by id');


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

この例では、動的 SQL は、 information_schema.columns テーブル。次に、プリペアド ステートメント stmt を使用して動的に生成された SQL を実行し、動的列を行に効果的にアンピボットします。

このアプローチを実装することで、特定のデータ ニーズに合わせて動的列を行に変換することができます。

以上がMySQL で動的列を行にアンピボットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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