このディレクトリの索引
#  出典: SQL質疑応答スレ 14問目 #934
#  たとえばですがある大会で1位3P・2位2P・3位1P・4位以下は0Pという風な加点があって
#  それぞれのチームの競技結果がデータとしてあるとします
#  
#  というわけでテーブル
#  ・競技結果
#  順位,チームコード,競技コード
#  ・加点
#  順位,得点
#  ・チーム
#  チーム名,チームコード
#  
#  このとき大会後の各チームの総得点とチーム名を出力させたいわけですが0点のチームがうまく出せません
#  
#  select チーム名, sum(得点) as 総得点
#  from (チーム join 競技結果 using (チームコード)) join 加点 using (順位)
#  where 順位 <= 3
#  group by チーム名, チームコード
#  
#  こうすると総得点が0点のチームはチーム名すら出なくなってしまうわけですが上手い方法はありませんか?

競技結果(3,1,16,13).
競技結果(8,2,16,7).
競技結果(4,1,3,6).
競技結果(2,2,3,10).
競技結果(1,1,1,8).

チーム(雨夜の星座,1).
チーム(消えた蠍,2).


'ある大会で1位3P・2位2P・3位1P・4位以下は0Pという風な加点があって、それぞれのチームの競技結果から加算された総得点とチーム名を求める'(_総得点,_チーム名) :-
チーム(_チーム名,_チームコード),
総得点(_チームコード,_総得点).

総得点(_チームコード,_総得点) :-
findsum(_加算された得点,(
競技結果(_順位,_チームコード,_競技コード,_得点),
加算された得点(_順位,_得点,_加算された得点)),_総得点).

加算された得点(_順位,_得点,_加算された得点) :-
加点(_順位,_加点),
_加算された得点 is _得点 + _加点.

加点(1,3) :- !.
加点(2,2) :- !.
加点(3,1) :- !.
加点(_,0).

findsum(A,P,Sum) :-
findall(A,P,L),
sum_list(L,Sum).