powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как победить транспонирование?
4 сообщений из 4, страница 1 из 1
Как победить транспонирование?
    #39700470
Dimets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос с результатами:


with t(grp_id, owner_id,start_date, end_date, act_type, type_code) as (
select 59,4231298, date '2018-09-26', date '2018-10-11','dev','OB' from dual union all
select 59,4231298, date '2018-10-27', date '2018-11-07','dev','OB' from dual union all
select 59,4231298, date '2018-09-30', date '2018-10-07','test','OB' from dual union all
select 59,4231298, date '2018-10-31', date '2018-11-03','test','OB' from dual union all
select 59,4231298, date '2018-10-31', date '2018-11-03','prod','OB' from dual union all
select 59,4231298, date '2018-09-30', date '2018-10-07','prod','OB' from dual
)
select * from t


Как получить на выходе вот так?


with t (grp_id, owner_id,type_code, dev_start, dev_end, test_start, test_end, prod_start, prod_end) as (
select 59,4231298, 'OB', date '2018-09-26', date '2018-10-11', date '2018-09-30', date '2018-10-07',
date '2018-10-31', date '2018-11-03' from dual union all
select 59,4231298, 'OB', date '2018-10-27', date '2018-11-07', date '2018-10-31', date '2018-11-03',
date '2018-09-30', date '2018-10-07' from dual
)
select * from t
...
Рейтинг: 0 / 0
Как победить транспонирование?
    #39700493
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimets,

По какому принципу группировать?
...
Рейтинг: 0 / 0
Как победить транспонирование?
    #39700495
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно примерно так...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t(grp_id, owner_id, start_date, end_date, act_type, type_code) as
  (
    select 59,4231298, date '2018-09-26', date '2018-10-11','dev', 'OB' from dual union all
    select 59,4231298, date '2018-10-27', date '2018-11-07','dev', 'OB' from dual union all
    select 59,4231298, date '2018-09-30', date '2018-10-07','test','OB' from dual union all
    select 59,4231298, date '2018-10-31', date '2018-11-03','test','OB' from dual union all
    select 59,4231298, date '2018-10-31', date '2018-11-03','prod','OB' from dual union all
    select 59,4231298, date '2018-09-30', date '2018-10-07','prod','OB' from dual
  )
select *
  from (
        select t.*,
               row_number() over (partition by act_type order by start_date) as rn
          from t
       )
pivot (
  min(start_date) as "START", max(end_date) as "END" for act_type in ('dev' as dev, 'test' as test, 'prod' as prod)
)
...
Рейтинг: 0 / 0
Как победить транспонирование?
    #39700496
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimets,

Исходя из циклы dev - test -prod не пересекаются:

Код: 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.
with t(grp_id, owner_id,start_date, end_date, act_type, type_code) as (
select 59,4231298, date '2018-09-26', date '2018-10-11','dev','OB' from dual union all
select 59,4231298, date '2018-10-27', date '2018-11-07','dev','OB' from dual union all
select 59,4231298, date '2018-09-30', date '2018-10-07','test','OB' from dual union all
select 59,4231298, date '2018-10-31', date '2018-11-03','test','OB' from dual union all
select 59,4231298, date '2018-10-31', date '2018-11-03','prod','OB' from dual union all
select 59,4231298, date '2018-09-30', date '2018-10-07','prod','OB' from dual 
),
x as (
      select  t.*,
              ceil(row_number() over(partition by grp_id,owner_id,type_code order by start_date) / 3) grp
        from  t
     )
select  grp_id,
        owner_id,
        type_code,
        dev_s dev_start,
        dev_e dev_end,
        test_s test_start,
        test_e test_end,
        prod_s prod_start,
        prod_e prod_end
  from  x
  pivot(
        min(start_date) s,
        max(end_date) e
        for act_type in ('dev' dev,'test' test,'prod' prod)
       )
/

    GRP_ID   OWNER_ID TY DEV_START  DEV_END    TEST_START TEST_END   PROD_START PROD_END
---------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
        59    4231298 OB 10/27/2018 11/07/2018 10/31/2018 11/03/2018 10/31/2018 11/03/2018
        59    4231298 OB 09/26/2018 10/11/2018 09/30/2018 10/07/2018 09/30/2018 10/07/2018

SQL> 



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


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