2017-02-15 1 views
0

Я новичок в postgresql. Я получаю ниже результатов запроса, и теперь мне нужно разделить одну строку, чтобы получить несколько строк. Я прошел через ссылки, но все равно не мог этого сделать. Пожалуйста помоги. unpivot and PostgreSQL How to split a row into multiple rows with a single query?Postgresql Разделить одну строку на несколько строк

Текущий результат

id,name,sub1code,sub1level,sub1hrs,sub2code,sub2level,sub2hrs,sub3code,sub3level,sub3hrs --continue till sub15 

1,Silva,CHIN,L1,12,MATH,L2,20,AGRW,L2,35 

2,Perera,MATH,L3,30,ENGL,L1,10,CHIN,L2,50 

Что мы хотим

id,name,subcode,sublevel,subhrs 

1,Silva,CHIN,L1,12 

1,Silva,MATH,L2,20 

1,Silva,AGRW,L2,35 

2,Perera,MATH,L3,30 

2,Perera,ENGL,L1,10 

2,Perera,CHIN,L2,50 

ответ

1

Использование союз:

select id, 1 as "#", name, sub1code, sub1level, sub1hrs 
from a_table 
union all 
select id, 2 as "#", name, sub2code, sub2level, sub2hrs 
from a_table 
union all 
select id, 3 as "#", name, sub3code, sub3level, sub3hrs 
from a_table 
order by 1, 2; 

id | # | name | sub1code | sub1level | sub1hrs 
----+---+--------+----------+-----------+--------- 
    1 | 1 | Silva | CHIN  | L1  |  12 
    1 | 2 | Silva | MATH  | L2  |  20 
    1 | 3 | Silva | AGRW  | L2  |  35 
    2 | 1 | Perera | MATH  | L3  |  30 
    2 | 2 | Perera | ENGL  | L1  |  10 
    2 | 3 | Perera | CHIN  | L2  |  50 
(6 rows) 

Столбец # не нужен, если вы хотите получить результат, отсортированный по subcode или sublevel.

Вы должны рассмотреть вопрос нормализации модели путем разделения данных на две таблицы, например .:

create table students (
    id int primary key, 
    name text); 

create table hours (
    id int primary key, 
    student_id int references students(id), 
    code text, 
    level text, 
    hrs int); 
+0

Большое спасибо за помощь, оказанную. Это прекрасно работает с использованием «union all». И спасибо за наконечник нормализации стола. К сожалению, теперь мы не можем изменить структуру таблицы. –

+1

Да, 'union all' имеет смысл, я добавил это для будущего читателя. – klin