ホームページ > データベース > mysql チュートリアル > MySQL テーブルの列データを行にピボットする方法?

MySQL テーブルの列データを行にピボットする方法?

Barbara Streisand
リリース: 2024-12-25 19:37:10
オリジナル
969 人が閲覧しました

How to Pivot MySQL Table Column Data into Rows?

MySQL ピボット テーブルの列データを行として回転する

MySQL でピボット テーブルの列データを行として回転するには、MAX( ) および CASE 関数と GROUP BY 句。一般的な構文は次のとおりです。

SELECT
  GROUP_BY_COLUMNS,
  MAX(CASE WHEN condition1 THEN column1 END) AS column1_alias,
  MAX(CASE WHEN condition2 THEN column2 END) AS column2_alias,
  ...
FROM TABLE
GROUP BY GROUP_BY_COLUMNS
ログイン後にコピー

この例には、3 つのテーブルがあります。 Question。アンケートの質問が含まれます。ユーザーを仕事に結び付ける結果。

各結果セットの列として質問の回答をピボットするには、次のクエリを使用できます。

SELECT  a.ID,
        a.user_ID,
        a.job_id,
        MAX(CASE WHEN c.question = 'Is it this?' THEN b.answer END) 'Is it this?',
        MAX(CASE WHEN c.question = 'Or this?' THEN b.answer END) 'Or this?',
        MAX(CASE WHEN c.question = 'Or that? ' THEN b.answer END) 'Or that? '
FROM    Results a
        INNER JOIN Answers b
            ON a.id = b.fk_result_id
        INNER JOIN Question c
            ON b.fk_question_id = c.ID
GROUP   BY a.ID,
        a.user_ID,
        a.job_id
ログイン後にコピー

このクエリは、回答テーブルには、fk_question_id フィールドに基づく質問テーブルと、fk_result_id フィールドに基づく結果テーブルが含まれます。次に、結果を ID、user_ID、job_id 列ごとにグループ化し、グループごとに、MAX() 関数と CASE ステートメントを使用して各質問に対する最大の回答を計算します。

または、質問の数が不明な場合は、利用可能な質問に基づいてクエリ文字列を構築する動的 SQL クエリを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN c.question = ''',
      question,
      ''' then b.answer end) AS ',
      CONCAT('`',question,'`')
    )
  ) INTO @sql
FROM Question;

SET @sql = CONCAT('SELECT  a.ID,
                            a.user_ID,
                            a.job_id, ', @sql, ' 
                    FROM    Results a
                            INNER JOIN Answers b
                                ON a.id = b.fk_result_id
                            INNER JOIN Question c
                                ON b.fk_question_id = c.ID
                    GROUP   BY a.ID,
                            a.user_ID,
                            a.job_id');

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

動的クエリは、各質問に必要な列を含む @sql 変数を作成し、プリペアド ステートメントとして実行します。

これらのクエリは、質問の回答を各結果セットの列として返すため、使いやすい形式で表示できます。

以上がMySQL テーブルの列データを行にピボットする方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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