我已经设置了一个简单的小提示来演示我的例子。
http://sqlfiddle.com/#!2/b7c813/7/0
有一张人员表和一张答案表。出于演示的目的,它们已被简化为此特定查询所需的列。
我理想的最终结果集看起来与上面提到的结果相似。
person_id, name, took_form_14, took_form_15
然而,我想要的是,只有那些选择14或者15的形式的人,或者不是15或者15的形式,而不是两者的两者(两列都是真的)。
我认为我可以使用额外的WHERE
子句来简单地将这些结果返回到NULL
,但我似乎无法确定删除take_form_14和took_form_15这两种情况的语法真。
当我尝试时,我收到了这个错误:
Invalid use of group function:
SELECT p.*,
MAX(CASE WHEN form_id = 14 THEN 'true' ELSE 'false' END) AS took_form_14,
MAX(CASE WHEN form_id = 15 THEN 'true' ELSE 'false' END) AS took_form_15
FROM people p
LEFT JOIN answers a ON a.person_id = p.id
WHERE(
MAX(CASE WHEN form_id = 14 THEN 'true' ELSE 'false' END) = 'false'
OR
MAX(CASE WHEN form_id = 15 THEN 'true' ELSE 'false' END) = 'false' )
GROUP BY p.id
我哪里错了?
另外,有人可以解释为什么我需要在我的case语句之前使用MAX函数,或者我得到不同的结果?
感谢您的帮助。
答案 0 :(得分:1)
您需要使用HAVING而不是其他地方。
像
这样的东西SELECT p.*,
MAX(CASE WHEN form_id = 14 THEN 'true' ELSE 'false' END) AS took_form_14,
MAX(CASE WHEN form_id = 15 THEN 'true' ELSE 'false' END) AS took_form_15
FROM people p
LEFT JOIN answers a ON a.person_id = p.id OR a.person_id IS NULL
GROUP BY p.id
HAVING took_form_14 = 'false' OR took_form_15 = 'false'