-1

私は3つのテーブルを持っています:

  • 最初のものには、人に関する情報が含まれています。関連する列はpersonIDです。
  • 2つ目は、人が実行できる演習が含まれています。たとえば、。を使用した3つの演習がありexIDます。
  • personID3つ目は、エクササイズ( )で人()が到達したポイントを含みますexID。したがって、ここの各行は、人が受けた試験を表しています。しかし、すべての人がすべての試験を受ける必要はありません。

私が欲しいのは、、、、、、 ...の列の結果です(personID試験の数に応じて進行中です)。また、結果の各行には、それぞれの試験のとポイントが含まれている必要があります。exam_oneexam_twoexam_threepersonID

受験されていない試験については、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 に答える