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