Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дублировать строку, которая встретилась по определённому признаку, разделив сумму. / 3 сообщений из 3, страница 1 из 1
23.12.2021, 18:40
    #40122540
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублировать строку, которая встретилась по определённому признаку, разделив сумму.
Добрый вечер!
Есть задачка, не соображу как сделать с ходу.
Нужно при определённых условиях выборки задублировать строку, при этом у одного поле нужно значение разделить на дубли.

Пример:

Запрос1:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select id, t1, SUM, prizn1, prizn2 from (
select 1 as id, 11 as t1, 10 as sum, 8003 as prizn1, 1805 as prizn2 from dual
union all
select 2 as id, 12 as t1, 10 as sum, 8003 as prizn1, 1807 as prizn2 from dual
union all
select 3 as id, 14 as t1, 20 as sum, 8003 as prizn1, 1803 as prizn2 from dual
union all
select 4 as id, 15 as t1, 40 as sum, 8003 as prizn1, 8103 as prizn2 from dual)



Запрос2:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select id, t1, SUM, prizn1, prizn2 from (
select 1 as id, 11 as t1, 10 as sum, 8003 as prizn1, 1805 as prizn2 from dual
union all
select 2 as id, 12 as t1, 10 as sum, 8003 as prizn1, 1807 as prizn2 from dual
union all
select 3 as id, 14 as t1, 20 as sum, 8003 as prizn1, 1803 as prizn2 from dual
union all
select 4 as id, 15 as t1, 40 as sum, 8003 as prizn1, 8103 as prizn2 from dual)
where PRIZN1 = 8003
and PRIZN2 not in (1803, 8103)




Запрос3:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select id, t1, SUM, prizn1, prizn2 from (
select 1 as id, 11 as t1, 5 as sum, 8003 as prizn1, 1805 as prizn2 from dual
union all
select 1 as id, 11 as t1, 5 as sum, 8003 as prizn1, 1805 as prizn2 from dual
union all
select 2 as id, 12 as t1, 5 as sum, 8003 as prizn1, 1805 as prizn2 from dual
union all
select 2 as id, 12 as t1, 5 as sum, 8003 as prizn1, 1805 as prizn2 from dual
union all
select 3 as id, 14 as t1, 20 as sum, 8003 as prizn1, 1803 as prizn2 from dual
union all
select 4 as id, 15 as t1, 40 as sum, 8003 as prizn1, 8103 as prizn2 from dual)




В запросе 2 есть условие отборки данных.
Как сделать так, чтобы на лету данные из запроса1 получились как в запросе3, при условии отбора в запросе2.

То есть мы видим, что в запросе1 попали первые две строки под эти условия, нужно, чтобы они раздвоились при этих условиях и сумма поделилась между раздвоенным.


За любую наводку по решению огромнейшее спасибо заранее!
...
Рейтинг: 0 / 0
23.12.2021, 19:05
    #40122547
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублировать строку, которая встретилась по определённому признаку, разделив сумму.
zorlo
Добрый вечер!

За любую наводку по решению огромнейшее спасибо заранее!


размножаем нечетные т1
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t  (id, t1, SUM, prizn1, prizn2) as (
  2  select 1 as id, 11 as t1, 10 as sum, 8003 as prizn1, 1805 as prizn2 from dual
  3  union all
  4  select 2 as id, 12 as t1, 10 as sum, 8003 as prizn1, 1807 as prizn2 from dual
  5  union all
  6  select 3 as id, 14 as t1, 20 as sum, 8003 as prizn1, 1803 as prizn2 from dual
  7  union all
  8  select 4 as id, 15 as t1, 40 as sum, 8003 as prizn1, 8103 as prizn2 from dual)
  9  , d as (select 1 o  from dual union all select 2 from dual)
 10  select t.*,decode(mod(t1,2),1,sum/2,sum) sum_na_2
 11  from t,d
 12  where o<=decode(mod(t1,2),1,2,1) --условие размножения (case when ... then 2)
 13* order by id,o
SQL> /

        ID         T1        SUM     PRIZN1     PRIZN2   SUM_NA_2
---------- ---------- ---------- ---------- ---------- ----------
         1         11         10       8003       1805          5
         1         11         10       8003       1805          5
         2         12         10       8003       1807         10
         3         14         20       8003       1803         20
         4         15         40       8003       8103         20
         4         15         40       8003       8103         20

6 rows selected.

SQL>



....
stax
...
Рейтинг: 0 / 0
23.12.2021, 19:22
    #40122555
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублировать строку, которая встретилась по определённому признаку, разделив сумму.
zorlo
То есть мы видим, что в запросе1 попали первые две строки под эти условия, нужно, чтобы они раздвоились при этих условиях и сумма поделилась между раздвоенным.
cross join либо unpivot
Код: 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.
SQL> with t as
  2  (
  3  select id, t1, SUM, prizn1, prizn2
  4  from (
  5  select 1 as id, 11 as t1, 10 as sum, 8003 as prizn1, 1805 as prizn2 from dual
  6  union all
  7  select 2 as id, 12 as t1, 10 as sum, 8003 as prizn1, 1807 as prizn2 from dual
  8  union all
  9  select 3 as id, 14 as t1, 20 as sum, 8003 as prizn1, 1803 as prizn2 from dual
 10  union all
 11  select 4 as id, 15 as t1, 40 as sum, 8003 as prizn1, 8103 as prizn2 from dual)
 12  )
 13  select id, t1, sum / x sum, prizn1, prizn2, type
 14  from (select tt.*, nvl2(flag, 2, 1) x
 15        from (select t.*, case when prizn2 not in (1803, 8103) then id end flag from t) tt)
 16  unpivot (id for type in (id as 'ORIGINAL', flag as 'DUPLICATED'))
 17  /

        ID         T1        SUM     PRIZN1     PRIZN2 TYPE
---------- ---------- ---------- ---------- ---------- ----------
         1         11          5       8003       1805 ORIGINAL
         1         11          5       8003       1805 DUPLICATED
         2         12          5       8003       1807 ORIGINAL
         2         12          5       8003       1807 DUPLICATED
         3         14         20       8003       1803 ORIGINAL
         4         15         40       8003       8103 ORIGINAL

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


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