2016-04-21 6 views
0

У меня есть оператор выбора, захватывая имена и степени из базы данных, подобных следующей:SQL Таблица/Сводные таблицы

ID_Num F_Name L_Name Deg_Type  Deg_Desc      Grad_Date 
001  Tyler Lee  Degree  Associates of Computer Science 08-Aug-2012 
002  Tyler Lee  Degree  Bachelors of Computer Science 08-Aug-2014 
003  Tyler Lee  Certificate Supervisory Certificate   08-Aug-2013 
004  Susie Q  Degree  Associates of Mathematics  08-Aug-2014 

мне нужно все данные на одной линии, как в следующем, как бы я это сделать ?

ID_Num F_Name L_Name Deg_Type Deg_Desc      Grad_Date Deg_Type Deg_Desc      Grad_Date Deg_Type  Deg_Desc     Grad_Date 
001  Tyler Lee  Degree Associates of Computer Science 08-Aug-2012 Degree Bachelors of Computer Science 08-Aug-2014 Certificate Supervisory Certificate 08-Aug-2013 
002  Susie Q  Degree Associates of Mathematics  08-Aug-2014 (null) (null)       (null)  (null)  (null)     (null) 

ответ

0

Вы могли бы сделать присоединяется к одной и той же таблицы, но вы будете искусственно ограничить количество результатов, однако многие присоединяется к вам указать (например, это не то, что вы хотите):

SELECT * FROM tbl AS t1 LEFT JOIN tbl AS t2 LEFT JOIN... where t1.F_Name=t2.F_Name and t1.L_Name=t2.L_Name and .....

То, что вы действительно хотите сделать, это нормализовать данные так, что у вас есть отдельный «студент» или «человек» стол, и «степени» таблицу с внешним ключом:

Table "Student": 
ID F_Name L_Name 
1 Tyler Lee 
1 Susie Q 

Table "Degree": 
Student_ID Desc       Grad_Date... 
1   Associates of Computer Science 08-Aug-2012... 
1   Associates of Mathematics  08-Aug-2014...

Тогда ваш запрос просто присоединиться Агаи НСТ два таблиц:

SELECT * FROM Student s LEFT JOIN Degree d on d.Student_ID=s.ID;

Если вы хотите иметь фиксированный набор степеней на выбор, вы можете просто «Degree» магазин различных типов степеней с их собственным Degree идентификаторов, то есть отображение таблица идентификатора студента с идентификатором степени.

0

Это сложно, потому что вы не знаете перед собой (или вы?), Сколько градусов человек с большинством градусов. Лучший способ сделать это - создать код на perl или на каком-то языке сценариев, который мог бы (a) запросить вашу таблицу, чтобы найти человека с наибольшим количеством степеней, затем (б) создать запрос динамически с помощью этого множества дополнительных столбцов.

НО, если предположить, что большинство степеней кто-то есть 4, это должно работать:

SELECT ID_Num 
    , F_Name 
    , L_Name 
    , max(case when r=1 then Deg_Type else null end) as Deg_Type_01 
    , max(case when r=1 then Deg_Desc else null end) as Deg_Desc_01 
    , max(case when r=1 then Grad_Date else null end) as Grad_Date_01 
    , max(case when r=1 then Deg_Type else null end) as Deg_Type_02 
    , max(case when r=1 then Deg_Desc else null end) as Deg_Desc_02 
    , max(case when r=1 then Grad_Date else null end) as Grad_Date_02 
    , max(case when r=1 then Deg_Type else null end) as Deg_Type_03 
    , max(case when r=1 then Deg_Desc else null end) as Deg_Desc_03 
    , max(case when r=1 then Grad_Date else null end) as Grad_Date_03 
    , max(case when r=1 then Deg_Type else null end) as Deg_Type_04 
    , max(case when r=1 then Deg_Desc else null end) as Deg_Desc_04 
    , max(case when r=1 then Grad_Date else null end) as Grad_Date_04 
    FROM (select ID_Num, F_Name, L_name 
      , Deg_Type, Deg_Desc, Grad_Date 
      , row_number() OVER (PARTITION BY ID_Num, F_Name, L_name) 
      from Student) as a 
GROUP BY ID_Num 
    , F_Name 
    , L_Name ; 

У меня нет доступа к системе оракула, поэтому, пожалуйста, дайте мне знать, если это не работает.

+0

Мы не знаем заранее, сколько градусов может быть у кого-то в базе данных, поэтому мне трудно оборачивать голову. –

+0

Если вы согласны с языками сценариев, вы можете (a) запросить базу данных и определить наибольшее количество градусов для любого человека (b) направить начало запроса в цикл файла (c) для max_degree для создания следующего три строки, изменяя значение r = $ loop_var и DegType_ $ loop_var, затем (d) нажимаем последнюю часть запроса в файл. Затем просто выполните динамически построенный запрос. – markwusinich

Смежные вопросы