2010-07-08 4 views

ответ

2
select 
    count(*) totalCount, 
    count(case when salary = 1000 then 1 else NULL end) specialCount 
from Employees 

COUNT подсчитывает непустые строки.

+0

, это дает тот же план выполнения, что и [ответ от @Tom H.] (http://stackoverflow.com/questions/3207157/problem-with-count/3207303#3207303). Кроме того, вам действительно не нужен 'else NULL', но удаление его не изменяет план выполнения. –

+0

@KM: Просто поместите его здесь, так как большинство людей, похоже, не знают, что на самом деле считает COUNT :) Особенно, что счетчик (*) эквивалентен счету (1), но не счет (столбец), если столбец является нулевым. – 2010-07-08 20:01:57

+0

+1, @ToxicAvenger, я согласен, большинство не понимает COUNT. ваш ответ так же быстро, как [ответ от @Tom H.] (http://stackoverflow.com/questions/3207157/problem-with-count/3207303#3207303) и намного лучше, чем те, у которых есть подзапрос в выберите список! –

3
SELECT COUNT(EmployeeID) as 'Total Employees', 
    (SELECT COUNT(EmployeeID) FROM Employees WHERE Salary = 1000) as 'Salaried' 
    FROM Employees 
+1

Запрашиваете ли вы одну и ту же таблицу дважды? –

+0

Использование подзапроса в списке выбора менее эффективно, чем один запрос, например [@Tom H. answer] (http://stackoverflow.com/questions/3207157/problem-with-count/3207303#3207303). Используя 'SET SHOWPLAN_ALL ON' этот запрос TotalSubtreeCost почти на 50% выше, чем один запрос @Tom H. answer –

0
select count(*) as employeeCount, 
(select count(*) from employee where salary=1000) as bigmoneyEmployeeCount 
from employee 
5

Другой метод:

SELECT 
    COUNT(*) AS total_employees, 
    SUM(CASE WHEN salary = 1000 THEN 1 ELSE 0 END) AS employees_with_1000_salary 
FROM 
    Employees 
+0

+1, как бы я это сделал –

Смежные вопросы