我有一个关于问题和答案的表,其中有两个相关的列和ID。问题的答案可以是数字或字母数字,如下所示:
╔══════════╦═════════════╦═══════════╦═════════╗
║ visit_id ║ visit_child ║ question ║ answer ║
╠══════════╬═════════════╬═══════════╬═════════╣
║ 121340 ║ 104280 ║ How much? ║ 3 ║
║ 121340 ║ 104280 ║ How many? ║ 2 ║
║ 121340 ║ 104280 ║ Why? ║ Because ║
║ 121340 ║ 104280 ║ Really? ║ Yup ║
║ 121485 ║ 114190 ║ How much? ║ 5 ║
║ 121485 ║ 114190 ║ How many? ║ 6 ║
║ 121485 ║ 114190 ║ Why? ║ Why not ║
║ 121485 ║ 114190 ║ Really? ║ Sure ║
╚══════════╩═════════════╩═══════════╩═════════╝
我想要旋转这些信息,这样问题就会变成列,给定的答案就会放在合适的位置。我正在寻找的结果如下所示:
╔══════════╦═════════════╦═══════════╦═══════════╦═════════╦═════════╗
║ visit_id ║ visit_child ║ How much? ║ How many? ║ Why? ║ Really? ║
╠══════════╬═════════════╬═══════════╬═══════════╬═════════╬═════════╣
║ 121340 ║ 104280 ║ 3 ║ 2 ║ Because ║ Yup ║
║ 121485 ║ 114190 ║ 5 ║ 6 ║ Why not ║ Sure ║
╚══════════╩═════════════╩═══════════╩═══════════╩═════════╩═════════╝
我已经做了我的家庭作业,并阅读了几个MySQL教程中的Howto pivot,我带来了以下内容:
SELECT
infoBase.visit_id,
infoBase.visit_child,
GROUP_CONCAT(DISTINCT
CONCAT('MAX(IF(infoBase.question = \'',question,'\', \'',answer,'\', 0)) AS \'',question,'\'',''), "\n"
)
FROM
visits vi,
infoBase
WHERE
vi.id = infoBase.visit_child
GROUP BY
infoBase.visit_id, infoBase.visit_child
我得到的结果如下:
╔══════════╦═════════════╦════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ visit_id ║ visit_child ║ GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(infoBase.question = \'',question,'\', \'',answer,'\', 0)) AS \'',question,'\'',''), "\n") ║
╠══════════╬═════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ 121340 ║ 104280 ║ MAX(IF(infoBase.question = 'How much?', '3', 0)) AS 'How much?',MAX(IF(infoBase.question = 'How many?', '2', 0)) AS 'How many?',MAX(IF(infoBase.question = 'Why?', 'Because', 0)) AS 'Why?',MAX(IF(infoBase.question = 'Really?', 'Yup', 0)) AS 'Really?' ║
║ 121485 ║ 114190 ║ MAX(IF(infoBase.question = 'How much?', '5', 0)) AS 'How much?',MAX(IF(infoBase.question = 'How many?', '6', 0)) AS 'How many?',MAX(IF(infoBase.question = 'Why?', 'Why not', 0)) AS 'Why?',MAX(IF(infoBase.question = 'Really?', 'Sure', 0)) AS 'Really?' ║
╚══════════╩═════════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
group_concat
检索到的结果是正确的,但我想,假设将该字符串“转换”为真正的列。这必须尽可能动态地完成,因为在实际的表中,我不知道问题的确切数量和它们是什么,所以我不能在许多group_concat
中对问题进行硬编码。我做错了什么??
谢谢!
附注:这是对一个更大的查询的过度简化。如果在出现新问题时需要添加更多信息,我会添加的。
发布于 2017-04-21 05:53:52
尝试这样的查询。这是未经测试的!
SELECT
infoBase.visit_id,
infoBase.visit_child,
GROUP_CONCAT(IF(question = 'How much?', answer ,'') SEPARATOR '' ) AS 'How much?' ,
GROUP_CONCAT(IF(question = 'How many?', answer ,'') SEPARATOR '' ) AS 'How many?' ,
GROUP_CONCAT(IF(question = 'Why?', answer ,'') SEPARATOR '' ) AS 'Why?' ,
GROUP_CONCAT(IF(question = 'Really?', answer ,'') SEPARATOR '' ) AS 'Really?'
)
FROM
visits vi,
infoBase
WHERE
vi.id = infoBase.visit_child
GROUP BY
infoBase.visit_id;
https://stackoverflow.com/questions/43530474
复制相似问题