我有一个包含PersonID和Code列的数据库。每个PersonID都有多个记录,每个记录都有一个代码。我想计算每个PersonID的Code出现次数等于特定值(例如,我希望Code等于“ R”的次数)。我希望它像这样退还
(((PersonID,Code_Count),(PersonID,Code_Count),(PersonID, Code_Count),...)
有人可以帮助我实现这一目标吗?
谢谢。
编辑:我认为这是正确的,任何人都可以确认吗?
SELECT PersonID,COUNT(*) as count FROM people WHERE Code="R" GROUP BY PersonID;
编辑:它不包括零计数,但我在下面添加了一个答案,即可解决该问题。
答案 0 :(得分:0)
您快到了,但是对于任何不匹配的PersonID
,您都不会得到任何行。
我还没有测试过,但是也许是这样的:
SELECT
`PersonID`,
SUM(CASE WHEN `Code` = "R" THEN 1 ELSE 0 END) AS `count`
FROM `People`
GROUP BY `PersonID`
通过删除条件,您不会淘汰不匹配的人物,而是with the CASE
you're still only counting matching rows。
您应该检查这种幼稚的方法是否可以按预期的规模使用索引。
答案 1 :(得分:0)
SELECT PersonID, CAST(SUM(CASE WHEN Code = "R" THEN 1 ELSE 0 END) AS SIGNED) AS count FROM People GROUP BY PersonID;
这完全按预期工作,感谢@LightnessRacesinOrbit的部分解决方案。