Sql 如何在一个查询中统计两个不同的数据

Sql 如何在一个查询中统计两个不同的数据,sql,sql-server,sql-server-2005,tsql,aggregate-functions,Sql,Sql Server,Sql Server 2005,Tsql,Aggregate Functions,我需要在一个查询中计算两列中某些数据的出现次数之和。数据库位于SQLServer2005中 例如,我有以下表格: Person: Id, Name, Age 我需要在一个查询中得到这些结果: 1.名为“John”的人数 2.30岁以上的“约翰”计数 我可以用这种方式通过子查询实现这一点(这只是一个示例): 但这是非常缓慢的,我正在寻找更快的方法 我在MySQL中发现了这一点(它几乎解决了我的问题,但不适用于SQL Server) 您知道在一个查询中计算几个计数比使用子查询更好的方法吗?使用CA

我需要在一个查询中计算两列中某些数据的出现次数之和。数据库位于SQLServer2005中

例如,我有以下表格:

Person: Id, Name, Age
我需要在一个查询中得到这些结果:
1.名为“John”的人数
2.30岁以上的“约翰”计数

我可以用这种方式通过子查询实现这一点(这只是一个示例):

但这是非常缓慢的,我正在寻找更快的方法

我在MySQL中发现了这一点(它几乎解决了我的问题,但不适用于SQL Server)


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

使用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
使用:

当多次访问同一个表时,最好是查看如何在一次过程中完成(SELECT语句)。这并不总是可能的

编辑:
如果您需要在查询中执行其他操作,请参阅Chris Shaffer的回答。

+1。该死,你跑得真快。你的答案出现在我在几乎相同的句子中键入WHERE子句时。下次我将在编辑之前回答。:)@肯·怀特:如果我先重新设置问题的格式,角色会颠倒过来:)技术上正确,但如果你只选择名称为“John”的行,然后在结果中使用大小写求和会更容易。我故意这样做作为一个例子(也是为什么我在
AllPersonsCount
中选择总计数)。这表明可以单独计算任何东西。
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
SELECT COUNT(p.id),
       SUM(CASE WHEN p.age > 30 THEN 1 ELSE 0 END)
  FROM PERSONS p
 WHERE p.name = 'John'