php - 在 MySQL 中以特定方式透视表

标签 php mysql sql pivot

还有其他数据透视表问题,但我似乎找不到问题的答案。

这是我的 table

ID    QUESTION       ANSWER       RECORDID      SORTORDER
1     Question 1     Answer 1.1   123456        1
2     Question 2     Answer 2.1   123456        2
3     Question 3     Answer 3.1   123456        3
4     Question 1     Answer 1.2   654321        1
5     Question 2     Answer 2.2   654321        2
6     Question 3     Answer 3.2   654321        3

等等

我想通过查询将其输出到:

Question 1    Question 2    Question 3
Answer 1.1    Answer 2.1    Answer 3.1
Answer 1.2    Answer 2.2    Answer 3.2

简而言之,问题列包含的问题不是唯一的(在此演示中有 2 个条目(参见 RECORDID)),因此需要按排序顺序对它们进行分组和排序。 RECORDID 始终是唯一的

我见过一些旋转/逆旋转示例,但无法理解它。 有人可以帮我解决这个问题吗?

最佳答案

这应该可以解决问题。在内部查询中,您仅获得特定问题的答案,而在外部查询中,当您按 recordid 分组时,您将摆脱空值......尝试仅运行内部查询以了解想法。

select  
  max(q.Question1),
  max(q.Question2),
  max(q.Question3) FROM (SELECT     
                         recordid,
                         case when question = 'Question 1' then answer else null end as Question1, 
                         case when question = 'Question 2' then answer else null end as Question2, 
                         case when question = 'Question 3' then answer else null end as Question3 FROM questions) q group by q.recordid

如果您有任何问题,请告诉我!

编辑:您的评论增加了另一层复杂性 :) 现在我明白了我们如何使用该排序顺序列...我们需要一个更多的内部查询来获取问题及其排序顺序。然后根据每个排序顺序获取答案,然后按记录 ID 分组以过滤掉空值并获得所需的结果。请试试这个,让我知道它是怎么回事......选择语句中的问题数量必须等于问题最多的表格的问题数量 - 我已经输入 8 只是为了告诉你这不应该限制你。现在您将不再依赖于问题名称 - 仅依赖于排序编号。最好有排序顺序 - 否则你必须为每个记录 ID 生成一个行号......

SET @rank=0; 设置@id:=0; 选择 记录编号, max(qq.question1) as '问题 1', max(qq.question2) as '问题 2', max(qq.question3) as '问题 3', max(qq.question4) as '问题 4', max(qq.question5) as '问题 5', max(qq.question6) as '问题 6', max(qq.question7) as '问题 7', max(qq.question8) as '问题 8' 从 ( 选择 记录编号, case when q.rownumber = 1 then CONCAT(question,': ', answer) else null end as question1, case when q.rownumber = 2 then CONCAT(question,': ', answer) else null end as question2, case when q.rownumber = 3 then CONCAT(question,': ', answer) else null end as question3, case when q.rownumber = 4 then CONCAT(question,': ', answer) else null end as question4, case when q.rownumber = 5 then CONCAT(question,': ', answer) else null end as question5, case when q.rownumber = 6 then CONCAT(question,': ', answer) else null end as question6, case when q.rownumber = 7 then CONCAT(question,': ', answer) else null end as question7, case when q.rownumber = 8 然后 CONCAT(question,': ', answer) else null end as question8 从( 选择 记录编号, 问题, 回答, 排序, @rank:=CASE WHEN @id=recordid THEN @rank+1 ELSE 1 END as rownumber, @id:=记录编号 来自按 recordid、sortorder 排序的问题 ) q )qq GROUP BY recordid

关于php - 在 MySQL 中以特定方式透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594980/

相关文章:

php - 使用 google geolocation api 进行地理定位

mysql - 存储过程: MySQL,错误

php - 使用 PHP 为每个日期/时间添加分钟

sql - 如何使用SQL计算表中的唯一记录并获取这些唯一记录的数量?

php - 2 个不同的值存储在数据库的一列下

php - PHP环境加密私钥存放在哪里

javascript - 测量两个形状之间的距离

PHP 似乎不能很好地处理 XML 字符串?

mysql - 跳过 mysql 更新中锁定的行以避免锁定超时

java - jdbc 到配置单元的连接被拒绝