MySQL数据透视表的列数据作为行 [英] MySQL Pivot Table Column Data as Rows

查看:213
本文介绍了MySQL数据透视表的列数据作为行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力寻找解决此MySQL问题的方法.我只是似乎不知道该怎么做.我有下表.

I'm struggling to find a solution this MySQL problem. I just can't seem to get my head around how to do it. I have the following tables.

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

如果可能的话,我想将问题答案显示为每个结果集的列,就像这样.

If possible I'd like to display the question answers as columns for each result set, like this.

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

任何帮助将不胜感激.

谢谢

推荐答案

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

  • SQLFiddle演示
    • SQLFiddle Demo
    • 如果您不清楚问题的数量(例如Matei Mihai所说的特别是1000个问题),则非常需要动态版本.

      If you have unknow number of questions (specifically 1000 like Matei Mihai said), a dynamic version is much required.

      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;
      

      • SQLFiddle演示
        • SQLFiddle Demo
        • 输出

          ╔════╦═════════╦════════╦═════════════╦══════════╦══════════╗
          ║ 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数据透视表的列数据作为行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆