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 サイトの他の関連記事を参照してください。