Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Посчитать количество пропущенных строк  [new]
SaraCorror
Member

Откуда:
Сообщений: 5
Доброго времени суток!

Для отчета необходимо посчитать кол-во пропущенных строк, то есть строк, которые есть в первой выборке, а во второй нет

Есть набор атрибутов "code1", "code2", "code3".
Есть таблица с данными вида:
date id_prod code_prod
'20180701' 1 code1
'20180701' 1 code3
'20180401' 2 code1
'20180401' 2 code2
'20180401' 2 code3
'20180701' 3 code1
'20180701' 3 code2
'20180701' 3 code3

результат должен быть таким:
в период '20180401' по '20180701'
код число пропущенных значений
code1 0
code2 1
code3 0

Делаю так:
declare @date_start date,
@date_end date

select @date_start = '20180401'
, @date_end = '20180701'

; with cte_s as
(
select *
from
(
values
('code1'), ('code2'), ('code3')
) cte (code)
)
select
SUM(CASE WHEN t.code_prod is null THEN 1 ELSE 0 END) over(partition by code) as CountNull
from cte s
left join (
select date, id_prod, code_prod
from dbo.FACT_FINDATA
where date between @date_start and @date_end
) t on s.code = t.code_prod

В результате все по нулям, почему не считается, что для code2 есть пропущенная строка?
Что делаю не правильно?
17 сен 18, 11:20    [21676538]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать количество пропущенных строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
SaraCorror
Что делаю не правильно?
Все.
Вы не понимаете как работает внешнее соединение. Для понимания выполните ваш код на таких данных:
'20180701'	1	code1
'20180701' 1 code3
'20180401' 2 code1
'20180401' 2 code3
'20180701' 3 code1
'20180701' 3 code3

Один из вариантов решения:
with cte as
(
 select [date], id_prod, code_prod from dbo.FACT_FINDATA where [date] between @date_start and @date_end
)
select
 a.code, sum(case when c.code_prod is null then 1 else 0 end)
from
 (values ('code1'), ('code2'), ('code3')) a(code) cross join
 (select distinct id_prod from cte) b left join
 cte c on c.id_prod = b.id_prod and c.code_prod = a.code
group by
 a.code;
17 сен 18, 11:54    [21676607]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать количество пропущенных строк  [new]
SaraCorror
Member

Откуда:
Сообщений: 5
Спасибо за подробный ответ, все заработало.
Сяду внимательнее изучать соединения
17 сен 18, 12:15    [21676652]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать количество пропущенных строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Вот еще
select
 a.code, count(*) over () - b.c
from
 (values ('code1'), ('code2'), ('code3')) a(code) outer apply
 (select count(*) from dbo.FACT_FINDATA where code_prod = a.code and [date] between @date_start and @date_end) b(c)
17 сен 18, 12:21    [21676665]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить