MySQL 列データを行としてピボットする
MySQL を使用する場合の一般的なタスクは、データを列形式から行形式に変換することです。 。ピボットとして知られるこのプロセスは、よりユーザーフレンドリーで理解しやすい方法でデータを提示する場合に特に役立ちます。
次のシナリオを考えてみましょう:
3 つのテーブルがあります:
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 サイトの他の関連記事を参照してください。