powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Суммирование по условиям из одной таблицы в другую
21 сообщений из 21, страница 1 из 1
Суммирование по условиям из одной таблицы в другую
    #40107930
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Имеются две таблицы, по условиям второй нужно прицепить суммарное значение из первой.
Первая таблица:
Код: 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,
            count(*)
            from 	list
            where 	a_date between '01012021' and '31122021'
            group by d, M, Title)



Вторая таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
		a.title,
                a.code,
		rtrim(substr(to_char(a.date,'mm.yyyy'),1,7)) as d_a_date,
		case	when a.b_date is null then '0'
				when a.b_date = a.c_date then '1'
				else to_char(ceil((a.c_date-a.b_date)/30.4167))
		end as d_M,
		coalesce(sum(count(*)) over (partition by a.title=Title,d_a_date=x.d,d_M>=x.M order by x.mis,x.prod_date,x.mod_name
		rows between unbounded preceding and current row),0) as mod_sum
from 	d_list a, t x
where 	trunc(d_a_date,'ddd') between '01012021' and '31032021';


Прошу помочь как это реализовать.
Запутался, но решение очевидно.
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40107967
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Digitalizer,

with cte1 as (), cte2 as () cte1 прицепить к cte2.

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

with cte1 as (), cte2 as () cte1 прицепить к cte2.


А каким образом не подскажите?
Чет совсем не догоняю.
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108107
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Digitalizer,

with cte1 as (), cte2 as () cte1 прицепить к cte2.

Хотя бы синтаксис потрудились изучить...
Обильный студентопад на форуме начался..


такое время наступило , скоро расслабон наступит
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108264
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Digitalizer,

вторую "таблицу" заверните во второй сте, как я написал, в общем запросе.
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108602
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.
28.
29.
30.
31.
32.
33.
34.
with cte1 as (select rtrim(substr(to_char(a_date,'mm.yyyy'),1,7)) as cte1_date,
	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 cte2_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 cte1_title,
	'1' as quantity
from 	vol_list
where 	a_date between '01032021' and '01032021'),

with cte2 as (select distinct
	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 cte2_title,
	a.kd||a.df||a.md||'|'||
        a.ta||a.ma||'-'||substr(o.kd,-3,3)||'-'||o.ind||'|'||
	substr(to_char(a_date,'mm.yyyy'),1,7)||'|'||
	case	when a.b_date is null then '0'
		when a.b_date = a.d_date then '1'
		else to_char(ceil((a.d_date-a.b_date)/30.4167))
	end as cte2_M,
	a.lentght
from 	inc_list a, vol_list o
where 	trunc(a_date,'ddd') BETWEEN '01032021' AND '01032021' and ((a.kol not in ('15','16','18','25')) or (a.kol in ('11'))))

select	*,sum (quantity)
from 	cte2 as a1 left join cte1 as b1 on (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date);


завернул, пишет ошибку "ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось"
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108606
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
28.
29.
30.
31.
32.
33.
34.
with cte1 as (select rtrim(substr(to_char(a_date,'mm.yyyy'),1,7)) as cte1_date,
	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 cte2_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 cte1_title,
	'1' as quantity
from 	vol_list
where 	a_date between '01032021' and '01032021'),

with cte2 as (select distinct
	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 cte2_title,
	a.kd||a.df||a.md||'|'||
        a.ta||a.ma||'-'||substr(o.kd,-3,3)||'-'||o.ind||'|'||
	substr(to_char(a_date,'mm.yyyy'),1,7)||'|'||
	case	when a.b_date is null then '0'
		when a.b_date = a.d_date then '1'
		else to_char(ceil((a.d_date-a.b_date)/30.4167))
	end as cte2_M,
	a.lentght
from 	inc_list a, vol_list o
where 	trunc(a_date,'ddd') BETWEEN '01032021' AND '01032021' and ((a.kol not in ('15','16','18','25')) or (a.kol in ('11'))))

select	*,sum (quantity)
from 	cte2 as a1 left join cte1 as b1 on (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date);


завернул, пишет ошибку "ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось"


Немножко смутил это префикс ORA-00923, видимо имелась в виду какая-то неведомая нам ORAльная акция №923?
Подскажите, вы ведь в курсе "запутался, но решение очевидно"
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108608
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то частенько стали в раздел по MS SQL вопросы из Oracle попадать


Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108638
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

автор with cte2 as (select distinct

как минимум второй with лишний

....
stax
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108742
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

убрал, но все равно пишет ошибку "ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось"
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108754
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Digitalizer
Stax,

убрал, но все равно ....


в сообщении об ошибке, есть номер строки, от него и ... (обычная отладка)
Код: plsql
1.
2.
select	*,sum (quantity)
from 	cte2 as a1 left join cte1 as b1 on (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date);



1) В оракля во from алиас принято писать без as
2) * нужен алиас (ы), или явный перечень столбцов
3) есть sum, нужен "group by"
4) может еще что-то
......
stax
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108777
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax

1) В оракля во from алиас принято писать без as
2) * нужен алиас (ы), или явный перечень столбцов
3) есть sum, нужен "group by"
4) может еще что-то


Код: plsql
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.
30.
31.
32.
33.
34.
35.
with cte1 as (select rtrim(substr(to_char(a_date,'mm.yyyy'),1,7)) as cte1_date,
	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 cte2_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 cte1_title,
	'1' as quantity
from 	vol_list
where 	a_date between '01032021' and '01032021'),

cte2 as (select distinct
	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 cte2_title,
	a.kd||a.df||a.md as cte2_code,
        a.ta||a.ma||'-'||substr(o.kd,-3,3)||'-'||o.ind||'|'||
	substr(to_char(a_date,'mm.yyyy'),1,7) as cte2_date,
	case	when a.b_date is null then '0'
		when a.b_date = a.d_date then '1'
		else to_char(ceil((a.d_date-a.b_date)/30.4167))
	end as cte2_M,
	a.lentght
from 	inc_list a, vol_list o
where 	trunc(a_date,'ddd') BETWEEN '01032021' AND '01032021' and ((a.kol not in ('15','16','18','25')) or (a.kol in ('11'))))

select	cte2_title, cte2_code, cte2_M, cte2_date, sum (quantity)
from 	cte2 left join cte1 on (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date)
group by   cte2_title, cte2_code, cte2_M, cte2_date;


теперь пишет:
"from cte2... ORA-00942: таблица или представление пользователя не существует"
"select cte2_title... ORA-00903: Неверно имя таблицы"
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108796
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Digitalizer,

Не допускайте пустых строк, sqlplus на них реагирует как на конец выражения. Каким инструментом пользуетесь?

Ну и в cte2 у вас inc_list и vol_list не соединены. Это так задумано?
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108815
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asmodeus

Не допускайте пустых строк, sqlplus на них реагирует как на конец выражения.


SET SQLBLA ON

SY.
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108880
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY

SET SQLBLA ON

спасибо.

Asmodeus,
Удалось решить ошибки, это полбеды. Выгружает, но нет столбца sum (quantity).
Подскажите где неточности в коде?
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108898
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Digitalizer

Выгружает, но нет столбца sum (quantity).

Код: plsql
1.
2.
3.
select	cte2_title, cte2_code, cte2_M, cte2_date, quantity -- + поля с cte1 --sum (quantity) 
from 	cte2 left join cte1 on (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date)
--group by   cte2_title, cte2_code, cte2_M, cte2_date;



сначала, посмотрите что/как у Вас сджоинилось


есть подозрения что ...

.....
stax
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108915
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

пустые столбцы
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40108935
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Digitalizer
Stax,

пустые столбцы

есть подозрения что
условие (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date)
"неточное"

сравните результаты cte1 и cte2
проверте выполняются ли условия

зы
странностей у Вас хватает
1) b_date = sysdate
2) trunc(a_date,'ddd') BETWEEN '01032021'
3) 22391348 дистинкт конечно дубли уберет, но осадок остается
4) ...

......
stax
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40109970
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Давайте я постараюсь объяснить какие входные данные, и какие должны получится выходные.
Таблица cte1
cte1_datecte1_Mcte1_titlequantity03.20210Title_12103.20210Title_22103.20210Title_3503.20211Title_143403.20211Title_222303.20211Title_313403.20212Title_12303.20212Title_26603.20212Title_379............

Таблица cte2
cte2_titlea.kd||a.df||a.mda.ta||a.ma||'-'||substr(o.kd -3 3)||'-'||o.indcte2_datecte2_Ma.lentghtTitle_11311014024000TTL10-000-A103.20210781Title_11311014024000TTL10-000-A103.20210539Title_11311014024000TTL20-000-A103.202112442Title_11311014024000TTL30-000-A103.202123339Title_13422092096000TTL20-000-A103.202123112Title_13450008000000TTL10-000-A103.202111473..................

Так вот, мне необходимо суммировать значения поля quantity из cte1 и вставить его в таблицу cte2, по условиям:
cte1_title = cte2_title
cte1_M >= cte2_M
cte1_date = cte2_date

Должно получится так:
cte2_titlea.kd||a.df||a.mda.ta||a.ma||'-'||substr(o.kd -3 3)||'-'||o.indcte2_datecte2_Ma.lentghttotalsumTitle_11311014024000TTL10-000-A103.20210781478Title_11311014024000TTL10-000-A103.20210539478Title_21311014024000TTL20-000-A103.202112442289Title_31311014024000TTL30-000-A103.20212333979Title_23422092096000TTL20-000-A103.20212311266Title_33450008000000TTL30-000-A103.202111473213.....................
например первая строчка, 478 получилось по условиям совпадения title_1 и 03.2021, а M нужно суммировать все что больше и равно 0 -> 21+434+23
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40110000
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Digitalizer,

Запарился с сортировкой, добавил ид

cte2_title,a_d,a_ta,cte2_date,cte2_M,a_lentght - уникальны


Код: plsql
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.
30.
31.
32.
33.
34.
35.
36.
37.
SQL> ed
Wrote file afiedt.buf

  1  with cte1(cte1_date,       cte1_M, cte1_title,     quantity) as (
  2  select '03.2021',0,'Title_1',21 from dual union all
  3  select '03.2021',0,'Title_2',21 from dual union all
  4  select '03.2021',0,'Title_3',5 from dual union all
  5  select '03.2021',1,'Title_1',434 from dual union all
  6  select '03.2021',1,'Title_2',223 from dual union all
  7  select '03.2021',1,'Title_3',134 from dual union all
  8  select '03.2021',2,'Title_1',23 from dual union all
  9  select '03.2021',2,'Title_2',66 from dual union all
 10  select '03.2021',2,'Title_3',79 from dual)
 11  ,cte2 (id,cte2_title,a_d,a_ta,cte2_date,cte2_M,a_lentght) as (
 12  select 1,'Title_1',1311014024000,'TTL10-000-A1','03.2021',0,781 from dual union all
 13  select 2,'Title_1',1311014024000,'TTL10-000-A1','03.2021',0,539 from dual union all
 14  select 3,'Title_2',1311014024000,'TTL20-000-A1','03.2021',1,2442 from dual union all
 15  select 4,'Title_3',1311014024000,'TTL30-000-A1','03.2021',2,3339 from dual union all
 16  select 5,'Title_2',3422092096000,'TTL20-000-A1','03.2021',2,3112 from dual union all
 17  select 6,'Title_3',3450008000000,'TTL10-000-A1','03.2021',1,1473 from dual)
 18  select id,cte2_title,a_d,a_ta,cte2_date,cte2_M,a_lentght
 19  ,sum (quantity) sq
 20  from cte2 left join cte1 on (cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date)
 21  group by id,cte2_title,a_d,a_ta,cte2_date,cte2_M,a_lentght
 22* order by 1
SQL> /

        ID CTE2_TI            A_D A_TA         CTE2_DA     CTE2_M  A_LENTGHT         SQ
---------- ------- -------------- ------------ ------- ---------- ---------- ----------
         1 Title_1  1311014024000 TTL10-000-A1 03.2021          0        781        478
         2 Title_1  1311014024000 TTL10-000-A1 03.2021          0        539        478
         3 Title_2  1311014024000 TTL20-000-A1 03.2021          1       2442        289
         4 Title_3  1311014024000 TTL30-000-A1 03.2021          2       3339         79
         5 Title_2  3422092096000 TTL20-000-A1 03.2021          2       3112         66
         6 Title_3  3450008000000 TTL10-000-A1 03.2021          1       1473        213

6 rows selected.



по старинке
Код: plsql
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SQL> ed
Wrote file afiedt.buf

  1  with cte1(cte1_date,       cte1_M, cte1_title,     quantity) as (
  2  select '03.2021',0,'Title_1',21 from dual union all
  3  select '03.2021',0,'Title_2',21 from dual union all
  4  select '03.2021',0,'Title_3',5 from dual union all
  5  select '03.2021',1,'Title_1',434 from dual union all
  6  select '03.2021',1,'Title_2',223 from dual union all
  7  select '03.2021',1,'Title_3',134 from dual union all
  8  select '03.2021',2,'Title_1',23 from dual union all
  9  select '03.2021',2,'Title_2',66 from dual union all
 10  select '03.2021',2,'Title_3',79 from dual)
 11  ,cte2 (cte2_title,a_d,a_ta,cte2_date,cte2_M,a_lentght) as (
 12  select 'Title_1',1311014024000,'TTL10-000-A1','03.2021',0,781 from dual union all
 13  select 'Title_1',1311014024000,'TTL10-000-A1','03.2021',0,539 from dual union all
 14  select 'Title_2',1311014024000,'TTL20-000-A1','03.2021',1,2442 from dual union all
 15  select 'Title_3',1311014024000,'TTL30-000-A1','03.2021',2,3339 from dual union all
 16  select 'Title_2',3422092096000,'TTL20-000-A1','03.2021',2,3112 from dual union all
 17  select 'Title_3',3450008000000,'TTL10-000-A1','03.2021',1,1473 from dual)
 18  select cte2_title,a_d,a_ta,cte2_date,cte2_M,a_lentght
 19  ,(select sum (quantity) from cte1 where  cte1_M>=cte2_M and cte2_title=cte1_title and cte1_date=cte2_date )sq
 20  from cte2
 21* order by 1
SQL> /

CTE2_TI            A_D A_TA         CTE2_DA     CTE2_M  A_LENTGHT         SQ
------- -------------- ------------ ------- ---------- ---------- ----------
Title_1  1311014024000 TTL10-000-A1 03.2021          0        781        478
Title_1  1311014024000 TTL10-000-A1 03.2021          0        539        478
Title_2  1311014024000 TTL20-000-A1 03.2021          1       2442        289
Title_2  3422092096000 TTL20-000-A1 03.2021          2       3112         66
Title_3  1311014024000 TTL30-000-A1 03.2021          2       3339         79
Title_3  3450008000000 TTL10-000-A1 03.2021          1       1473        213

6 rows selected.

SQL>



ps
в Таблица cte2 чутку подправил титле
.....
stax
...
Рейтинг: 0 / 0
Суммирование по условиям из одной таблицы в другую
    #40110511
Digitalizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

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


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