我有一个类似于以下内容的表
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
我不知道是否可以使查询的输出看起来像这样。
有人可以告诉我这是否可行。
答案 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
现在,如果您有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;
两者都会产生相同的结果:
| PIN | QUESTION1 | QUESTION2 |
--------------------------------
| 1111 | 1 | 3 |
| 2222 | 4 | 3 |
| 3333 | (null) | 5 |