Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составление sql запроса по / 9 сообщений из 9, страница 1 из 1
06.04.2021, 21:30
    #40060223
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Добрый день. Прошу помочь с составлением SQL запроса по заданным параметрам: есть исходная первая таблица, нужно кумулятивно посчитать кол-во id помесячно с учетом EndDate (как во второй таблице)

ID StartDate EndDate
1 01.01.2018 12.02.2018
2 01.02.2018 12.03.2018
3 15.02.2018
4 01.03.2018
5 12.03.2018
6 16.03.2018


Месяц Количество
январь 1
февраль 2
март 4
...
Рейтинг: 0 / 0
06.04.2021, 22:21
    #40060228
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table #t (id int, StartDate date, EndDate date )

insert into #t values 
(1, '20180101', '20180212'),
(2, '20180201', '20180312'),
(3, '20180215', null),
(4, '20180301', null),
(5, '20180312', null),
(6, '20180316', null)
go

with cte (ID, dDate) as
(select ID,  StartDate from #t where StartDate is not null
union all
select ID, EndDate from #t where EndDate is not null
)
select datename(month, dDate) as 'Месяц', count(ID) as 'Количество', month(dDate) from cte group by month(dDate), datename(month, dDate) order by month(dDate)
go

drop table #t
...
Рейтинг: 0 / 0
07.04.2021, 14:26
    #40060368
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
PaulWist
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table #t (id int, StartDate date, EndDate date )

insert into #t values 
(1, '20180101', '20180212'),
(2, '20180201', '20180312'),
(3, '20180215', null),
(4, '20180301', null),
(5, '20180312', null),
(6, '20180316', null)
go

with cte (ID, dDate) as
(select ID,  StartDate from #t where StartDate is not null
union all
select ID, EndDate from #t where EndDate is not null
)
select datename(month, dDate) as 'Месяц', count(ID) as 'Количество', month(dDate) from cte group by month(dDate), datename(month, dDate) order by month(dDate)
go

drop table #t



Спасибо! Только немного не верно в условиях указал, нужно чтобы в итоге таблица получалась месяц с годом и количество ID без повторений

Такая:
Месяц Количество
январь 2018 1
февраль 2018 2
март 2018 4

По вашему запросу если в EndDate добавить дату например до 2021 года, то один и тот же ID будет два раза считаться


авторcreate table #t (id int, StartDate date, EndDate date )

insert into #t values
(1, '20180101', '20180212'),
(2, '20180201', '20180312'),
(3, '20180215', null),
(4, '20180301', null),
(5, '20180312', null),
(6, '20180316', '20210312'),
(7, '20180411', null),
(8, '20180512', '20210212')
go

with cte (ID, dDate) as
(select ID, StartDate from #t where StartDate is not null
union all
select ID, EndDate from #t where EndDate is not null
)
select DATEADD(MONTH, DATEDIFF(MONTH, 0, cte.dDate), 0) as 'Месяц', count(distinct(ID)) as 'Количество'
from cte
group by DATEADD(MONTH, DATEDIFF(MONTH, 0, cte.dDate), 0), month(cte.dDate)
order by DATEADD(MONTH, DATEDIFF(MONTH, 0, cte.dDate), 0)
go
...
Рейтинг: 0 / 0
07.04.2021, 14:40
    #40060374
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Не могу пред. сообщение отредактировать

Ответ такой получается по последнему запросу:

2018-01-01 1
2018-02-01 3
2018-03-01 4
2018-04-01 1
2018-05-01 1
2021-02-01 1
2021-03-01 1

А нужен такой:

2018-01-01 1
2018-02-01 3
2018-03-01 5
2018-04-01 5
2018-05-01 6
2021-02-01 5
2021-03-01 4
...
Рейтинг: 0 / 0
07.04.2021, 15:02
    #40060384
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Dolphiin,

А нужен такой:

DolphiinА нужен такой:

2018-01-01 1
2018-02-01 3
2018-03-01 5
2018-04-01 5
2018-05-01 6
2021-02-01 5
2021-03-01 4


Не пойму, почему в марте 2018 должно быть 5, а не 4.

автор(1, '20180101', '20180212'),
(2, '20180201', '20180312'),
(3, '20180215', null),
(4, '20180301', null),
(5, '20180312', null),
(6, '20180316', '20210312'),
(7, '20180411', null),
(8, '20180512', '20210212')
...
Рейтинг: 0 / 0
07.04.2021, 18:05
    #40060482
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
PaulWist,
авторНе пойму, почему в марте 2018 должно быть 5, а не 4.

Ещё подходит (3, '20180215', null), т.к. у него нет даты окончания. Наверно немного не понятно все объясняю, реальное задание - есть список контрактов (ID), дата начала контракта и дата окончания контракта. Нужно помесячно с годами посчитать кумулятивно их количество. Получается условия:
- если у контракта нет даты окончания, его в каждом месяце нужно прибавлять
- если есть дата окончания, то перестать прибавлять в следующем месяце после даты окончания
...
Рейтинг: 0 / 0
07.04.2021, 18:25
    #40060497
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Dolphiin,

создайте помесячную таблицу-календарь и ищите пересечения
...
Рейтинг: 0 / 0
07.04.2021, 19:07
    #40060507
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Dolphiin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
drop table if exists #t;
create table #t (id int, StartDate date, EndDate date );

insert into #t values
(1, '20180101', '20180212'),
(2, '20180201', '20180312'),
(3, '20180215', null),
(4, '20180301', null),
(5, '20180312', null),
(6, '20180316', '20210312'),
(7, '20180411', null),
(8, '20180512', '20210212');
go

select year_month, max(summ) as cnt 
  from (
         select format(dt,'yyyyMM') as year_month
              , sum(inc) over(order by dt) as summ 
           from (
                  select StartDate as dt, 1 as inc 
                    from #t
                   union all
                  select EndDate as dt, -1 as inc 
                    from #t
                   where EndDate is not null
                ) as v0
       ) as v1
 group by year_month
 order by year_month;
...
Рейтинг: 0 / 0
08.04.2021, 11:07
    #40060626
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление sql запроса по
Щукина Анна

Благодарю, как раз то что нужно
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составление sql запроса по / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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