在我的查询结果中获取2列

时间:2012-11-12 13:00:27

标签: mysql pivot

我有一个类似于以下内容的表

PIN    QuestionNum     Response
1111   1               1
1111   2               3
2222   1               4
2222   2               3
3333   2               5

我的查询的预期输出将是:

PIN   Question1   Question2
1111  1           3
2222  4           3
3333  null        5

我不知道是否可以使查询的输出看起来像这样。

有人可以告诉我这是否可行。

1 个答案:

答案 0 :(得分:3)

这基本上是PIVOT,但MySQL没有PIVOT功能。因此,您需要使用聚合函数和CASE语句来复制它。如果您知道所拥有的QuestionNum值的数量,那么您可以对查询进行硬编码,类似于:

select pin,
  max(case when QuestionNum = 1 then response end) Question1,
  max(case when QuestionNum = 2 then response end) Question2
from yourtable
group by pin

请参阅SQL Fiddle with Demo

现在,如果您有QuestionNum的未知数量的值,那么您可以使用预准备语句生成此查询的动态版本:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when QuestionNum = ''',
      QuestionNum,
      ''' then response end) AS Question',
      QuestionNum
    )
  ) INTO @sql
FROM yourtable;

SET @sql = CONCAT('SELECT pin, ', @sql, ' 
                  FROM yourtable 
                  GROUP BY pin');

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

请参阅SQL Fiddle with Demo

两者都会产生相同的结果:

|  PIN | QUESTION1 | QUESTION2 |
--------------------------------
| 1111 |         1 |         3 |
| 2222 |         4 |         3 |
| 3333 |    (null) |         5 |