ホームページ > データベース > mysql チュートリアル > MySQL の列データを行にピボットする方法: SQL クエリのアプローチ?

MySQL の列データを行にピボットする方法: SQL クエリのアプローチ?

Mary-Kate Olsen
リリース: 2024-12-19 14:06:12
オリジナル
106 人が閲覧しました

How to Pivot MySQL Column Data into Rows: A SQL Query Approach?

MySQL 列データを行としてピボットする

MySQL を使用する場合の一般的なタスクは、データを列形式から行形式に変換することです。 。ピボットとして知られるこのプロセスは、よりユーザーフレンドリーで理解しやすい方法でデータを提示する場合に特に役立ちます。

次のシナリオを考えてみましょう:

3 つのテーブルがあります:

  • 質問テーブル (id, question)
  • 結果テーブル (id, user_id, job_id)
  • Answers テーブル (id、answer、fk_question_id、fk_result_id)

Questions テーブルには、考えられる質問のリストが含まれています。結果テーブルは、ユーザーとジョブの結果を関連付けます。 Answers テーブルには、結果ごとに質問に対するユーザーの回答が保存されます。

目標は、質問の回答を結果セットごとに列として表示することです。望ましい結果は次のとおりです。

+-----------+---------+--------+-------------+----------+----------+
| result_id | user_id | job_id | Is it this? | Or this? | Or that? |
+-----------+---------+--------+-------------+----------+----------+
| 1         | 1       | 1      | Yes         | No       | Maybe    |
| 2         | 1       | 3      | Maybe       | No       | Maybe    |
| 3         | 2       | 3      | Yes         | Yes      | No       |
+-----------+---------+--------+-------------+----------+----------+
ログイン後にコピー

この変換を実現するには、次の MySQL クエリを利用できます。

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

このクエリは、INNER JOIN ステートメントと MAX( ) および CASE 関数を使用して、各質問と結果の組み合わせに対する回答を集計します。データを列形式から行形式に効果的にピボットし、回答を列として視覚化できるようにします。

このクエリを実行するには、FROM 句と JOIN 句のテーブル名と列名を実際のテーブルに置き換えます。および列名。実行されると、クエリはピボットされたデータを目的の形式で返します。

または、質問が多数ある場合は、クエリの動的 SQL バージョンを使用して、不明な数の質問を処理できます。この動的なアプローチは、ピボットされた結果の列の数が不明な場合、または頻繁に変更される場合に特に役立ちます。動的 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;
ログイン後にコピー

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

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