2012-10-22 49 views
-1

我有3個表:如何GROUP BY成單獨的列

  • 第一個包含個人信息。相關欄目是personID
  • 第二個包含一個人可以做的練習。例如有一個exID 3個練習。
  • 第三個包含一個人(personID)在練習中達到的分數(exID)。所以這裏的每一行代表一個人的考試。但不是每個人都需要參加每個考試。

我想什麼都與列personIDexam_oneexam_twoexam_three,...(持續的,這取決於有多少考試有)的結果。結果的每一行都應包含personID以及相應考試的分數。

對於沒有采取的考試應該有NULL或什麼的。

爲表人示例:對於練習表

personID | Name | ... 
------------------- 
1  | Max | 
2  | Peter | 

示例:點表

exID | exName | maxPoints | ... 
------------------------------- 
1 | exam1 | 20 
2 | exam2 | 25 
3 | exam3 | 20 

實施例:

personID (fkey) | exID (fkey) | points 
---------------------------------------- 
    1   | 1  | 12.5 
    1   | 3  | 10 
    2   | 1  | 5 
    2   | 2  | 8.5 
    2   | 3  | 10 

祝結果:

personId | exam1 | exam2 | exam3 
------------------------------------ 
    1  | 12.5 | NULL | 10 
    2  | 5 | 8.5 | 10 

有沒有辦法做到這一點?我使用PostgreSQL的

+2

很多方法可以做到這一點,是的。請提供一個迄今爲止嘗試過的例子。 – Ryan

+1

請提供架構,示例數據和所需輸出。 – RedFilter

+0

有數據透視表,但是你的問題缺乏相關信息,比如DBMS和表結構。 http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – GolezTrol

回答

3

您可以使用類似以下內容:

select p.personId, 
    sum(case when e.exname = 'exam1' then t.points end) Exam1, 
    sum(case when e.exname = 'exam2' then t.points end) Exam2, 
    sum(case when e.exname = 'exam3' then t.points end) Exam3 
from persons p 
left join points t 
    on p.personID = t.personID 
left join exercises e 
    on t.exid = e.exid 
group by p.personid 

SQL Fiddle with Demo

+0

工作正常,但不夠靈活。可以有更多或更少的考試,名稱可以不同。我不知道練習表將包含什麼 – Nythagoras