Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Посчитать количество пропущенных строк / 4 сообщений из 4, страница 1 из 1
17.09.2018, 11:20
    #39703448
SaraCorror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посчитать количество пропущенных строк
Доброго времени суток!

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

Есть набор атрибутов "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 есть пропущенная строка?
Что делаю не правильно?
...
Рейтинг: 0 / 0
17.09.2018, 11:54
    #39703480
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посчитать количество пропущенных строк
SaraCorrorЧто делаю не правильно?Все.
Вы не понимаете как работает внешнее соединение. Для понимания выполните ваш код на таких данных:
Код: plaintext
1.
2.
3.
4.
5.
'20180701'	1	code1
'20180701'	1	code3
'20180401'	2	code1
'20180401'	2	code3
'20180701'	3	code1
'20180701'	3	code3

Один из вариантов решения:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;
...
Рейтинг: 0 / 0
17.09.2018, 12:15
    #39703497
SaraCorror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посчитать количество пропущенных строк
Спасибо за подробный ответ, все заработало.
Сяду внимательнее изучать соединения
...
Рейтинг: 0 / 0
17.09.2018, 12:21
    #39703499
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посчитать количество пропущенных строк
Вот еще
Код: sql
1.
2.
3.
4.
5.
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)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Посчитать количество пропущенных строк / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]