如何在一个查询中计算2个不同的数据

时间:2011-04-02 19:38:01

标签: sql sql-server sql-server-2005 tsql aggregate-functions

我需要在一个查询中计算两列中某些数据的出现总和。 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)。

您是否知道在一个查询中计算少数计数的方法比使用子查询更好?

2 个答案:

答案 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的回答。