Показывать 0 при подсчете (*) запроса из одной таблицы - PullRequest
0 голосов
/ 02 марта 2020

Я выполняю запрос к одной таблице, чтобы получить подсчет всех различных ошибок, которые выделяют данные. В большинстве дней должно быть 0 ошибок. В результате по группам нет записей в результате. Мне нужна запись для каждой группы, которая должна отображаться в столбце count(*), если нет ошибок. Как я могу это сделать?

select ITEM_CODE, NBR, CATEGORY, count(*) as ERR_CNT
from ITEM_TRCKR
where (
       DATEDIFF(dd,[ITM_SENT_DT],GETDATE()) > 1
         AND [DSBRSMNT_RECVD_DT] = 'NULL'
   )
group by
ITEM_CODE, NBR, CATEGORY

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Если вы хотите, чтобы все группировки использовали cross join для их генерации, затем left join для ввода дополнительной информации:

select i.ITEM_CODE, n.NBR, c.CATEGORY,
       count(it.item_code) as ERR_CNT
from (select distinct item_code from ITEM_TRCKR) i cross join
     (select distinct nbr from item_trkr) n cross join
     (select distinct category from item_trkr) c left join
     item_trkr it
     on it.item_code = i.item_code and
        it.nbr = n.nbr and
        it.category = c.cateogry and
        DATEDIFF(day, it.ITM_SENT_DT, GETDATE()) > 1 and
        it.DSBRSMNT_RECVD_DT is null
group by i.ITEM_CODE, n.NBR, c.CATEGORY;

Я предполагаю, что it.DSBRSMNT_RECVD_DT - это дата. Следовательно, сравнение NULL должно проводиться с концепцией SQL NULL, а не со строкой 'NULL'.

1 голос
/ 02 марта 2020

Предполагая, что у вас есть хотя бы одна запись в день (с ошибкой или без нее), можно выполнить условную агрегацию одним из следующих способов:

select 
    item_code, 
    nbr, 
    category, 
    sum(case when dsbrsmnt_recvd_dt] = 'null' then 1 else 0 end) as err_cnt
from item_trckr
where [itm_sent_dt] < cast(getdate() as date) 
group by item_code, nbr, category

Обратите внимание, что <expr> = 'null' фактически проверяет exr на литеральная строка 'null'. Если вам нужно подсчитать значения null в столбце, вы можете использовать тот факт, что count(<expr>) игнорировать null s:

select 
    item_code, 
    nbr, 
    category, 
    count(*) - count(dsbrsmnt_recvd_dt) err_cnt
from item_trckr
where [itm_sent_dt] < cast(getdate() as date) 
group by item_code, nbr, category
...