-1

我有 3 张桌子:

  • 第一个包含有关人员的信息。相关列是personID.
  • 第二个包含一个人可以做的练习。例如,有 3 个带有exID.
  • 第三个包含一个人 ( 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

4

1 回答 1

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

于 2012-10-22T19:38:13.583 回答