Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как победить транспонирование? / 4 сообщений из 4, страница 1 из 1
10.09.2018, 15:32
    #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
10.09.2018, 16:10
    #39700493
mibin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить транспонирование?
Dimets,

По какому принципу группировать?
...
Рейтинг: 0 / 0
10.09.2018, 16:13
    #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
10.09.2018, 16:13
    #39700496
SY
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как победить транспонирование? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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