我有一个带有score
列的表,并取决于我想将它们分组为不同的'发行者'并计数它们的得分量。
问题在于,当score
记录实际遇到"批评者"one_answers"发起人"时,我只会得到"被动"。这是我的查询:
SELECT
CASE
WHEN score < 133 THEN 'Detractors'
WHEN score BETWEEN 133 AND 209 THEN 'Passives'
WHEN score = 210 THEN 'Promotors'
END AS 'Issuer',
COUNT(1) AS 'Amount'
FROM my_data
关于正在发生的事情的任何建议?
包含聚合函数的查询(例如COUNT()
或MAX()
),没有GROUP BY
子句,总是会返回一行。如果列(甚至像Issuer
这样的计算列)可能包含不同的值,则服务器必须选择其中一个。
文档指出:
在这种情况下,服务器可以自由从每个组中选择任何值, 因此,除非它们是相同的,否则所选的值是不确定的, 这可能不是您想要的。
在您的情况下, Issuer
可以包含三个值("批评者","被动","启动器"),并且服务器已使"被动"变为"被动"。
请注意,启用ONLY_FULL_GROUP_BY
模式(默认情况下是版本5.7),您的查询将失败而错误。
ONLY_FULL_GROUP_BY
拒绝选择列表,
HAVING
条件或ORDER BY
的查询 列表请参阅未命名的非聚集列GROUP BY
子句在功能上也取决于(唯一确定 by)GROUP BY
列。
您的情况中的解决方案很简单:在查询中包括GROUP BY Issuer
SELECT
CASE
WHEN score < 133 THEN 'Detractors'
WHEN score BETWEEN 133 AND 209 THEN 'Passives'
WHEN score = 210 THEN 'Promotors'
END AS 'Issuer',
COUNT(1) AS 'Amount'
FROM my_data
GROUP BY `Issuer`