2016-04-21 57 views
0

我有一個select語句從類似於下面的數據庫抓取的名稱和度: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...

然後將查詢是一個簡單的加入agai NST兩個表​​:

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

如果你想有一個固定的集合度的選擇,你可以只是「度」商店不同類型的學位與自己等級的ID,然後有一個映射學生ID到學位ID的表格。

0

這很難,因爲你以前不知道(或者你?)度數最高的人有多少度。這樣做的最好方法是用perl或某種腳本語言創建代碼,這些代碼可以(a)查詢你的表以找到度數最高的人,然後(b)動態創建一個包含許多額外列的查詢。

,但如果我們假設大部分學位有人爲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 ; 

我沒有訪問Oracle系統,所以請讓我知道這是行不通的。

+0

事先並不知道數據庫中有多少人可能擁有多少度數,這就是讓我難以理解的原因。 –

+0

如果您符合腳本語言,您可以(a)查詢數據庫並確定任何一個人的最大度數(b)將查詢的開始推到文件(c)循環以獲取max_degree以創建下一個三行,改變r = $ loop_var和DegType_ $ loop_var的值,然後(d)將查詢的最後部分推送到文件。然後只需執行動態構建的查詢。 – markwusinich