ホームページ >データベース >mysql チュートリアル >動的に生成されたユーザー定義の列名を持つ SQL テーブル データを転置するにはどうすればよいですか?

動的に生成されたユーザー定義の列名を持つ SQL テーブル データを転置するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-05 21:40:41596ブラウズ

How Can I Transpose SQL Table Data with Dynamically Generated User-Defined Column Names?

ユーザー定義のフィールド名を使用した SQL テーブル データの転置

データのピボットまたは転置には、列が属性を表すテーブルの変換が含まれます。行はエンティティ データを表し、行は属性を表し、列はエンティティ データを表します。これは、提供されているテーブルの例に見られるように、ユーザー定義のフィールド名を操作するときに便利です。

転置テーブルのクエリ

指定されたテーブルを転置するには、次のようにします。次に示すように、SQL 関数と条件ステートメントを組み合わせて使用​​できます。以下:

SELECT t.UserId,
       MAX(CASE WHEN t.FieldName = 'Username' THEN t.FieldValue ELSE NULL END) AS Username,
       MAX(CASE WHEN t.FieldName = 'Password' THEN t.FieldValue ELSE NULL END) AS Password,
       MAX(CASE WHEN t.FieldName = 'Email Address' THEN t.FieldValue ELSE NULL END) AS Email
FROM t
GROUP BY t.UserId

説明

  • MAX 関数は、特定のフィールド名のフィールド値に対応する各列の最大値を返します。
  • CASE ステートメントは、FieldName 列を評価し、WHERE に表示される各フィールド名に対応する FieldValue を返します。
  • GROUP BY 句は、結果を UserId ごとにグループ化し、各ユーザーのデータが個別の行に配置されるようにします。

準備されたステートメントを使用した動的クエリ

フィールド名の動的なリストを処理するには、MySQL の Prepared Statement を利用できます。 (動的 SQL) 構文:

SET @sql = 'SELECT UserId, ';
SELECT GROUP_CONCAT(CONCAT('MAX(CASE WHEN FieldName = ''', FieldName, ''' THEN FieldValue ELSE NULL END) AS ', FieldName)) INTO @sql FROM (SELECT DISTINCT FieldName FROM t);
SET @sql = CONCAT(@sql, ' FROM t GROUP BY UserId');
PREPARE stmt FROM @sql;
EXECUTE stmt;

このクエリは、テーブル内の個別のフィールド名に基づいて SQL ステートメントを動的に構築し、準備されたステートメントを使用して実行します。

以上が動的に生成されたユーザー定義の列名を持つ SQL テーブル データを転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。