如何将GROUP BY分成不同的列

时间:2012-10-22 18:59:53

标签: sql postgresql pivot

我有3张桌子:

  • 第一个包含有关人员的信息。相关列是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

1 个答案:

答案 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

请参阅SQL Fiddle with Demo