복붙노트

[SQL] MySQL의 피벗 테이블의 열 데이터 행으로

SQL

MySQL의 피벗 테이블의 열 데이터 행으로

나는 해결책이 MySQL의 문제를 찾기 위해 사투를 벌인거야. 난 그냥 작업을 수행하는 방법 주위에 내 머리를 얻을 수없는 것. 나는 다음과 같은 테이블이있다.

Question table
+----+-------------+
| id | question    |
+----+-------------+
| 1  | Is it this? |
| 2  | Or this?    |
| 3  | Or that?    |
+----+-------------+

Results Table
+----+---------+--------+
| id | user_id | job_id |
+----+---------+--------+
| 1  | 1       | 1      |
| 2  | 1       | 3      |
| 3  | 2       | 3      |
+----+---------+--------+

Answers table
+----+-------------------------+--------------+
| id | answer | fk_question_id | fk_result_id |
+----+-------------------------+--------------+
| 1  | Yes    | 1              | 1            |
| 2  | No     | 2              | 1            |
| 3  | Maybe  | 3              | 1            |
| 4  | Maybe  | 1              | 2            |
| 5  | No     | 2              | 2            |
| 6  | Maybe  | 3              | 2            |
| 7  | Yes    | 1              | 3            |
| 8  | Yes    | 2              | 3            |
| 9  | No     | 3              | 3            |
+----+-------------------------+--------------+

가능하면 나는 다음과 같이 각 결과 세트에 대한 열의와 같은 질문의 답을 표시하고 싶습니다.

+-----------+---------+--------+-------------+----------+----------+
| 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       |
+-----------+---------+--------+-------------+----------+----------+

어떤 도움이 많이 주시면 감사하겠습니다.

감사

해결법

  1. ==============================

    1.

    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
    

    질문 (Matei 미하이 말했듯이 특별히 1000)의 알 수없는 번호가있는 경우, 동적 버전이 많이 필요합니다.

    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;
    

    산출

    ╔════╦═════════╦════════╦═════════════╦══════════╦══════════╗
    ║ 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       ║
    ╚════╩═════════╩════════╩═════════════╩══════════╩══════════╝
    
  2. from https://stackoverflow.com/questions/15656273/mysql-pivot-table-column-data-as-rows by cc-by-sa and MIT license