0

私は次のクエリを実行しています

    SELECT 
        p.id
        ,q.name
        ,pa.result
    FROM
        postulant_answers as pa
    LEFT OUTER JOIN postulants as p ON (p.id = pa.postulant_id)
    LEFT OUTER JOIN questions as q ON (q.id = pa.question_id);

次の結果が表示されます。

    +------+--------------+--------+
    | id   | name         | result |
    +------+--------------+--------+
    |    9 | Question 1   |     15 |
    |    9 | Question 2   |     70 |
    |    9 | Question 3   |     75 |
    |  591 | Question 1   |     15 |
    |  591 | Question 2   |     70 |
    |  591 | Question 3   |     75 |

しかし、私はもっと次のようなものが必要です:

    +------+------------+------------+------------+
    | id   | Question 1 | Question 2 | Question 3 |
    +------+------------+------------+------------+
    |    9 |         15 |         70 |         75 |
    |  591 |         15 |         70 |         75 |

1つのクエリでそれを行うことはできますか?
どんな助けでもいただければ幸いです

4

1 に答える 1

2

これはピボットと呼ばれますが、MySQLにはピボット関数がないため、集計関数とCASE:を使用してこれを実装できます。

SELECT p.id,
  max(case when q.name = 'Question 1' then pa.result end) Question1,
  max(case when q.name = 'Question 2' then pa.result end) Question2,
  max(case when q.name = 'Question 3' then pa.result end) Question3
FROM postulant_answers as pa
LEFT OUTER JOIN postulants as p 
  ON (p.id = pa.postulant_id)
LEFT OUTER JOIN questions as q 
  ON (q.id = pa.question_id)
group by p.id

SQL FiddlewithDemoを参照してください

結果:

|  ID | QUESTION1 | QUESTION2 | QUESTION3 |
-------------------------------------------
|   9 |        15 |        70 |        75 |
| 591 |        15 |        70 |        75 |

上記は、質問の数がわかっている場合はうまく機能しますが、質問の数が不明な場合は、次のようなプリペアドステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when q.name = ''',
      q.name,
      ''' then pa.result end) AS ',
      replace(name, ' ', '')
    )
  ) INTO @sql
FROM questions;

SET @sql = CONCAT('SELECT p.id, ', @sql, ' 
                  FROM postulant_answers as pa
                  LEFT OUTER JOIN postulants as p 
                    ON (p.id = pa.postulant_id)
                  LEFT OUTER JOIN questions as q 
                    ON (q.id = pa.question_id)
                  group by p.id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL FiddlewithDemoを参照してください

于 2012-12-05T18:17:00.960 に答える