Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / развернуть столбец в строку - case when (10) / 3 сообщений из 3, страница 1 из 1
15.03.2018, 12:02
    #39615284
ncux199rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
развернуть столбец в строку - case when (10)
Добрый день.
Подскажите как в постгресе можно развернуть таблицу.
Есть таблица иерархии id--parent_id--level. id могут находиться не на каждом level. Но всегда будет связь id с paretn id.
Как развернуть таблицу в строку и вывести зависимости по level?
Чтоб в результате запроса было 2 строки?

l1 |des1| l2 |desc2| l3 |des3| l4 |des4
1 | desc | 2 | desc | 3 | desc | 4 | desc
5 | desc | 6 | desc | 0 | 0000 | 7 | desc


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE public.test_case (id integer, parent_id integer,  level integer,  "desc" text COLLATE pg_catalog."default")
WITH (   OIDS = FALSE)
TABLESPACE pg_default;

INSERT INTO test_case VALUES (1, 0, 1, 'test1');
INSERT INTO test_case VALUES (2, 1, 2, 'test2');
INSERT INTO test_case VALUES (3, 2, 3, 'test3');
INSERT INTO test_case VALUES (4, 3, 4, 'test4');
INSERT INTO test_case VALUES (5, 1, 1, 'test5');
INSERT INTO test_case VALUES (6, 5, 2, 'test6');
INSERT INTO test_case VALUES (7, 6, 4, 'test7');

SELECT 
CASE WHEN level = 1 THEN id ELSE 0 END AS lev1,
CASE WHEN level = 2 THEN id ELSE 0 END AS lev2,
CASE WHEN level = 3 THEN id ELSE 0 END AS lev3,
CASE WHEN level = 4 THEN id ELSE 0 END AS lev4
	FROM public.test_case;


...
Рейтинг: 0 / 0
15.03.2018, 13:05
    #39615337
Silender
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
развернуть столбец в строку - case when (10)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select lev1.id as lev1_id, lev1.desc as lev1_desc, 
       lev2.id as lev2_id, lev2.desc as lev2_desc, 
       lev3.id as lev3_id, lev3.desc as lev3_desc, 
       lev4.id as lev4_id, lev4.desc as lev4_desc
from test_case lev1
left join test_case lev2 on lev2.level=2 and lev2.parent_id=lev1.id
left join test_case lev3 on lev3.level=3 and lev3.parent_id in (lev2.id,lev1.id)
left join test_case lev4 on lev4.level=4 and lev4.parent_id in (lev1.id,lev2.id,lev3.id)
where lev1.level=1
order by lev1.id, lev2.id, lev3.id, lev4.id;
...
Рейтинг: 0 / 0
16.03.2018, 10:40
    #39615803
ncux199rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
развернуть столбец в строку - case when (10)
решилось так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with recursive req AS (
SELECT t.id, t.parent_id, t.level, t.desc, t.id as zlevel
	from test_case t
	where t.id in (4,7)
union
	SELECT l.id, l.parent_id, l.level, l.desc, zlevel
	from test_case l
	join req on l.id = req.parent_id
)
 select 
 max(CASE WHEN level = 1 THEN id ELSE 0 END) as l1,
max(CASE WHEN level = 1 THEN req.desc ELSE 'none' END) as l1,
max(CASE WHEN level = 2 THEN id ELSE 0 END) as l2,
max(CASE WHEN level = 2 THEN req.desc ELSE 'none' END) as l2,
max(CASE WHEN level = 3 THEN id ELSE 0 END) as l3,
max(CASE WHEN level = 3 THEN req.desc ELSE 'none' END) as l3,
max(CASE WHEN level = 4 THEN id ELSE 0 END) as l4,
max(CASE WHEN level = 4 THEN req.desc ELSE 'none' END) as l4
 from req
 group by zlevel
 order by zlevel;
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / развернуть столбец в строку - case when (10) / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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