Как посчитать 2 разных данных в одном запросе - PullRequest
6 голосов
/ 02 апреля 2011

Мне нужно вычислить сумму вхождений некоторых данных в два столбца в одном запросе.БД находится в SQL Server 2005.

Например, у меня есть эта таблица:

Person: Id, Name, Age

И мне нужно получить в одном запросе эти результаты:
1. Количество людей, которые имеютname '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

Но это очень медленно, и я ищу более быстрый метод.

Я нашел это решение для MySQL (оно почти решило мою проблему, но не для SQL Server).

Знаете ли вы лучший способ рассчитать несколько подсчетов водин запрос, чем использование подзапросов?

Ответы [ 2 ]

16 голосов
/ 02 апреля 2011

Использование оператора 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
8 голосов
/ 02 апреля 2011

Использование:

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

Всегда предпочтительнее при доступе к одной и той же таблице более одного раза, чтобы проверить, как это можно сделать за один проход (оператор SELECT).Это не всегда возможно.

Редактировать:

Если вам нужно выполнить другие действия в запросе, см. Ответ Криса Шаффера.

...