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

Mar*_*acz 6 sql t-sql sql-server sql-server-2005 aggregate-functions

我需要在一个查询中计算两列中某些数据的出现总和.DB位于SQL Server 2005中.

例如,我有这个表:

Person: Id, Name, Age
Run Code Online (Sandbox Code Playgroud)

我需要在一个查询中得出这些结果:
1.名字为'John'的人数
2.计算'John',年龄超过30岁.

我可以通过这种方式使用子查询来做到这一点(仅作为示例):

SELECT (SELECT COUNT(Id) FROM Persons WHERE Name = 'John'), 
  (SELECT COUNT (Id) FROM Persons WHERE Name = 'John' AND age > 30) 
FROM Persons
Run Code Online (Sandbox Code Playgroud)

但这很慢,我正在寻找更快的方法.

我找到了MySQL的这个解决方案(它几乎解决了我的问题,但它不适用于SQL Server).

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

Chr*_*fer 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
Run Code Online (Sandbox Code Playgroud)

  • 技术上是正确的,但如果您只选择名称为"John"的行,然后在SUM的结果上使用CASE,则会更容易. (3认同)
  • 我故意将其作为一个例子(也是为什么我选择了'AllPersonsCount`中的总计数).这表明可以单独计算任何东西. (2认同)

OMG*_*ies 8

使用:

SELECT COUNT(p.id),
       SUM(CASE WHEN p.age > 30 THEN 1 ELSE 0 END)
  FROM PERSONS p
 WHERE p.name = 'John'
Run Code Online (Sandbox Code Playgroud)

在多次访问同一个表时总是更可取的,以便在单个过程中查看它是如何完成的(SELECT语句).它并不总是可能的.

编辑:

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