Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Агрегирование с обратным накопительным итогом / 8 сообщений из 8, страница 1 из 1
28.10.2021, 10:07
    #40107642
Digitalizer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Добрый день,

Имеется код выгрузки таблицы:
Код: 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.
select 	rtrim(substr(to_char(a_date,'mm.yyyy'),1,7)),
		case	when b_date is null then '0'
				when b_date = sysdate then '1'
				when (sysdate-b_date)/30.4167 > 0 and (sysdate-b_date)/30.4167 < 1 then '1'
				else to_char(floor((sysdate-b_date)/30.4167))
		end as M,
		case	
				when substr(t,1,3) in ('999') then 'Title_1'
				when substr(t,2,2) in ('87','88') then 'Title_2'
				when substr(t,3,2) in ('11','13','14','21','23','24') then 'Title_3'
				else null 
		end as Title,
		count(*)
from 	list
where 	a_date between '01012021' and '31122021'
group by 	rtrim(substr(to_char(a_date,'mm.yyyy'),1,7)),
		case	when b_date is null then '0'
				when b_date = sysdate then '1'
				when (sysdate-b_date)/30.4167 > 0 and (sysdate-b_date)/30.4167 < 1 then '1'
				else to_char(floor((sysdate-b_date)/30.4167))
		end,
		case	
				when substr(t,1,3) in ('999') then 'Title_1'
				when substr(t,2,2) in ('87','88') then 'Title_2'
				when substr(t,3,2) in ('11','13','14','21','23','24') then 'Title_3'
				else null 
		end


Прошу помочь дополнить его так, чтобы на выходе получилось суммарное значение по каждому пропущенному M с обратным накопительным итогом.
Пример привел в экселе .
Так же интересует каким образом можно сократить group by заменив там case M и Title? Если просто прописать через запятую их, то ругается на ошибку.
Заранее спасибо.
...
Рейтинг: 0 / 0
28.10.2021, 10:37
    #40107652
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as ( select 	rtrim(substr(to_char(a_date,'mm.yyyy'),1,7)) as d,
		        case	when b_date is null then '0'
				        when b_date = sysdate then '1'
				        when (sysdate-b_date)/30.4167 > 0 and (sysdate-b_date)/30.4167 < 1 then '1'
				        else to_char(floor((sysdate-b_date)/30.4167))
		        end as M,
		        case	
				        when substr(t,1,3) in ('999') then 'Title_1'
				        when substr(t,2,2) in ('87','88') then 'Title_2'
				        when substr(t,3,2) in ('11','13','14','21','23','24') then 'Title_3'
				        else null 
		        end as Title
            from 	list
            where 	a_date between '01012021' and '31122021'
        )
select d, M, Title, count(*) from t group by d, M, Title
...
Рейтинг: 0 / 0
28.10.2021, 11:54
    #40107679
Digitalizer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
aleks222, Спасибо. Со вторым моментом разобрались, а как быть с накопительным итогом? ))
...
Рейтинг: 0 / 0
28.10.2021, 12:11
    #40107685
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Digitalizer,

нарастающий итог можно подсчитать при помощи sum() over().
...
Рейтинг: 0 / 0
28.10.2021, 13:12
    #40107719
Digitalizer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Владислав Колосов,
Получилось, добавил это
Код: sql
1.
2.
coalesce(sum(count(*)) over (partition by title,a_date order by m,a_date,title
rows between unbounded preceding and current row),0) as total


Но как быть с недостающими M?
Я имею ввиду, что есть разрыв между 0 и скажем 10, т.е. M здесь пусто
Mcountsum01010131341023517406545814610450
а мне нужно чтобы они тоже были бы заполнены.
Например вот так:
Mcountsum01010131321331341023517406545745814694610450
...
Рейтинг: 0 / 0
28.10.2021, 15:15
    #40107759
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Digitalizer,

добавьте в запрос таблицу чисел, в которой перечислены все М .
...
Рейтинг: 0 / 0
29.10.2021, 06:59
    #40107926
Digitalizer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Владислав Колосов
Digitalizer,

добавьте в запрос таблицу чисел, в которой перечислены все М .

К сожалению М не содержит фиксированных значений, каждый месяц прирастает на +1
...
Рейтинг: 0 / 0
29.10.2021, 10:36
    #40107965
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Агрегирование с обратным накопительным итогом
Digitalizer,

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


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