Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамическое именование столбцов / 4 сообщений из 4, страница 1 из 1
02.09.2021, 14:57
    #40094836
E_Schekaturova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое именование столбцов
Добрый день

Прошу помочь с реализацией размножения поля (см. пример во вложении)
PL/SQL у меня крайне низкоуровневый, на SQL Oracle пробовала разные варианты, но до итогового решения не дошла
Пример моих изысканий:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
create table bureau
(
report_key number,
bureau_date date
)
;

insert into bureau
   (report_key, bureau_date)
 values
   (1, to_date('15/07/2020', 'dd/mm/yyyy'));
insert into bureau
   (report_key, bureau_date)
 values
   (2, to_date('01/05/2020', 'dd/mm/yyyy'));
commit
;

--не получилось развернуть pivot-ом, нужны динамические именования столбцов (хардкодом их добавлять не вариант)
select distinct
    report_key, bureau_date, add_months(bureau_date,-level) as prev_months, level as rn, 'cut_date_'||level as field_name
from BUREAU b
connect by
    prior report_key = report_key and
    prior bureau_date = bureau_date and
    prior dbms_random.value is not null and
    level between 1 and 10
  order by report_key, bureau_date, 4
;

--не тот вид, что ожидаю
with dates as (
 select distinct
    report_key, bureau_date, add_months(bureau_date,-level) as cut_date, level as rn, 'cut_date_'||level as field_name
from BUREAU b
connect by
    prior report_key = report_key and
    prior bureau_date = bureau_date and
    prior dbms_random.value is not null and
    level between 1 and 10
  order by report_key, bureau_date, 4)
select distinct *
from dates
  pivot xml(min(cut_date) for(field_name) in (select distinct field_name from dates)) 
;



Спасибо заранее
...
Рейтинг: 0 / 0
02.09.2021, 15:37
    #40094855
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое именование столбцов
E_Schekaturova

PL/SQL у меня крайне низкоуровневый


про PL/SQL не понял

генерить динамически селект (хоть пивот, хоть декоде)

но вот только вопрос что с ним (курсором) дальше делать/как использовать

.....
stax
...
Рейтинг: 0 / 0
02.09.2021, 17:11
    #40094876
E_Schekaturova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое именование столбцов
Stax,

имела в виду, что, может, какой-то цикл можно написать, который атрибуты будет от i до j добавлять в табличку
...
Рейтинг: 0 / 0
02.09.2021, 17:25
    #40094882
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое именование столбцов
E_Schekaturova
Stax,

имела в виду, что, может, какой-то цикл можно написать, который атрибуты будет от i до j добавлять в табличку

не совсем понимаю, что Вам надо
напр
шахматка для emp

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select * from (select deptno,job,sal from scott.emp) e 
pivot (sum(sal) for(job) in ( 
    'ANALYST' job_an,'CLERK' job_cl,'SALESMAN' job_sa,'MANAGER' job_ma,'PRESIDENT' job_pr) 
    ) 
order by deptno 


DEPTNO	JOB_AN	JOB_CL	JOB_SA	JOB_MA	JOB_PR
10	-	1300	-	2450	5000
20	6000	1900	-	2975	-
30	-	950	5600	2850	-
Download CSV
3 rows selected.



Вам надо программно (цикл) сформировать строку

'ANALYST' job_an,'CLERK' job_cl,'SALESMAN' job_sa,'MANAGER' job_ma,'PRESIDENT'

используя табличку emp

и так для любой выборки
да будет два прогона, один для формирования строки, второй сам результат


зы
конкретно по Вашей bureau,
если Вам надо формровать шахматку в зависомости от параметра n(число 10)
то достаточно просто for i in (1..n) loop ...

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


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