powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составление sql запроса по
9 сообщений из 9, страница 1 из 1
Составление sql запроса по
    #40060223
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Прошу помочь с составлением 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
Составление sql запроса по
    #40060228
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
...
Рейтинг: 0 / 0
Составление sql запроса по
    #40060368
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Составление sql запроса по
    #40060374
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу пред. сообщение отредактировать

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

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
Составление sql запроса по
    #40060384
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Составление sql запроса по
    #40060482
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist,
авторНе пойму, почему в марте 2018 должно быть 5, а не 4.

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

создайте помесячную таблицу-календарь и ищите пересечения
...
Рейтинг: 0 / 0
Составление sql запроса по
    #40060507
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Составление sql запроса по
    #40060626
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна

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


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