我有3张桌子:
personID
。 exID
的3个练习。 personID
)在练习中达到的分数(exID
)。因此,这里的每一行代表一个人已经参加的考试。但不是每个人都需要参加每一次考试。我希望得到的结果是列personID
,exam_one
,exam_two
,exam_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
答案 0 :(得分: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