2

我有一个如下所示的表

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

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

任何人都可以请告知这是否可能。

4

1 回答 1

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

现在,如果您有未知数量的值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

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

|  PIN | QUESTION1 | QUESTION2 |
--------------------------------
| 1111 |         1 |         3 |
| 2222 |         4 |         3 |
| 3333 |    (null) |         5 |
于 2012-11-12T13:02:23.243 回答