SQL: Count() на основе значения столбца
У меня есть таблица следующим образом:
CallID | CompanyID | OutcomeID
----------------------------------
1234 | 3344 | 36
1235 | 3344 | 36
1236 | 3344 | 36
1237 | 3344 | 37
1238 | 3344 | 39
1239 | 6677 | 37
1240 | 6677 | 37
Я хотел бы создать SQL script, который подсчитывает количество результатов продаж и количество всех других попыток (что угодно < > 36), например:
CompanyID | SalesCount | NonSalesCount
------------------------------------------
3344 | 3 | 1
6677 | 0 | 2
Есть ли способ сделать COUNT(), который содержит условие, такое как COUNT (CallID WHERE OutcomeID = 36)?
Ответы
Ответ 1
Вы можете использовать выражение CASE с вашим агрегатом, чтобы получить итоговое значение на основе значения outcomeId
:
select companyId,
sum(case when outcomeid = 36 then 1 else 0 end) SalesCount,
sum(case when outcomeid <> 36 then 1 else 0 end) NonSalesCount
from yourtable
group by companyId;
См. SQL Fiddle with Demo
Ответ 2
Что-то вроде этого:
SELECT companyId,
COUNT(CASE WHEN outcomeid = 36 THEN 1 END) SalesCount,
COUNT(CASE WHEN outcomeid <> 36 THEN 1 END) NonSalesCount
FROM
yourtable
GROUP BY
companyId
должен работать - COUNT()
подсчитывает только не нулевые значения.
Ответ 3
Да. Граф не учитывает значения NULL, поэтому вы можете сделать это:
select
COUNT('x') as Everything,
COUNT(case when OutcomeID = 36 then 'x' else NULL end) as Sales,
COUNT(case when OutcomeID <> 36 then 'x' else NULL end) as Other
from
YourTable
В качестве альтернативы вы можете использовать SUM, как показано на рисунке bluefeet.
Ответ 4
SELECT
companyId, SalesCount, TotalCount-SalesCount AS NonSalesCount
FROM
(
select
companyId,
COUNT(case when outcomeid = 36 then 1 else NULL end) SalesCount,
COUNT(*) AS TotalCount
from yourtable
group by companyId
) X;
Используя этот взаимно исключающий шаблон с COUNT(*)
- избегает (очень малых) накладных расходов при оценке второго условного
COUNT
- дает правильные значения, если
outcomeid
может быть NULL
Использование @bluefeet SQLFiddle с добавленными NULL