SQL: несколько операторов подсчета с разными критериями
Мне просто интересно, есть ли способ получить два отдельных "подсчета" итогов из таблицы с использованием одного запроса? То есть, используя таблицу, похожую на следующую, я хотел бы получить каждый код (отдельный) и показать общее количество состояний "НЕ равно X или D", а затем добавить дополнительный столбец, который показывает общее количество статусов "равно" на X или D, а дата отмены больше заданной даты (например, последние 14 дней).
Таблица:
Code: Status Cancel_Date
-----------------------------------
AAA X 2012-02-01
AAA
BBB X 2012-02-01
AAA D 2012-01-01
AAA
BBB
BBB D 2012-02-01
BBB X 2012-01-01
Результат примера (на основе приведенных выше данных):
Code: TotalNotXorD TotalXorD
------------------------------------
AAA 2 1
BBB 1 2
TotalNotXorD: например.
select code, count(*)
from table
where status not in('X','D')
group by code
TotalXorD: например.
select code, count(*)
from table
where status in('X','D')
and cancel_date >= '2012-02-01'
group by code
Я посмотрел на выполнение подзапросов и т.д., но я не могу получить результаты, которые мне нужны.
Любые идеи?
Спасибо.
Ответы
Ответ 1
SELECT a.code,
COALESCE(b.totalNotXorD, 0 ) totalNotXorD,
COALESCE(c.totalXorD, 0 ) totalXorD,
FROM (SELECT DISTINCT Code FROM tableName) a
LEFT JOIN
(
select code, count(*) totalNotXorD
from table
where status not in('X','D')
group by code
) b ON a.code = b.code
LEFT JOIN
(
select code, count(*) totalXorD
from table
where status in('X','D')
and cancel_date >= '2012-02-01'
group by code
) c ON a.code = c.code
Забастовкa >
или просто делать CASE
SELECT Code,
SUM(CASE WHEN status NOT IN ('X','D') OR status IS NULL THEN 1 ELSE 0 END) TotalNotXorD,
SUM(CASE WHEN status IN ('X','D') AND cancel_date >= '2012-02-01' THEN 1 ELSE 0 END) TotalXorD
FROM tableName
GROUP BY Code