我需要在一个查询中计算两列中某些数据的出现总和。 DB位于SQL Server 2005中。
例如我有这张表:
Person: Id, Name, Age
我需要在一个查询中得到这些结果:
1.名字为“约翰”的人数
2.年龄超过30岁的'约翰'计数。
我可以通过这种方式使用子查询(仅作为示例):
SELECT (SELECT COUNT(Id) FROM Persons WHERE Name = 'John'),
(SELECT COUNT (Id) FROM Persons WHERE Name = 'John' AND age > 30)
FROM Persons
但这很慢,我正在寻找更快的方法。
我发现这个solution用于MySQL(它几乎解决了我的问题,但它不适用于SQL Server)。
您是否知道在一个查询中计算少数计数的方法比使用子查询更好?
答案 0 :(得分:16)
使用CASE语句可以计算单个查询中的所需内容:
SELECT
SUM(CASE WHEN Persons.Name = 'John' THEN 1 ELSE 0 END) AS JohnCount,
SUM(CASE WHEN Persons.Name = 'John' AND Persons.Age > 30 THEN 1 ELSE 0 END) AS OldJohnsCount,
COUNT(*) AS AllPersonsCount
FROM Persons
答案 1 :(得分:8)
使用:
SELECT COUNT(p.id),
SUM(CASE WHEN p.age > 30 THEN 1 ELSE 0 END)
FROM PERSONS p
WHERE p.name = 'John'
在多次访问同一个表时总是更可取的,以便查看在单个过程中如何完成它(SELECT语句)。它并非总是可能。
如果您需要在查询中执行其他操作,请参阅Chris Shaffer的回答。