このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/614
#  ・DBMS名とバージョン 
#  MySQL 
#   
#  ・テーブルデータ 
#  店舗(店舗ID 店舗名) 
#   
#  商品(商品ID 店舗ID 商品名) 
#  (※同じ名前の商品が複数の店舗にあっても、別の商品として扱う) 
#   
#  売り上げ(売り上げID 商品ID 個数) 
#   
#  ・欲しい結果 
#  店舗名 商品名 売り上げ個数合計 
#  (※店舗名、商品名でソート) 
#   
#  ・説明 
#  SELECT * FROM `店舗` ORDER BY `店舗名`; 
#  この結果をプログラム側でループ 
#  SELECT * FROM 商品 WHERE 店舗ID=? ORDER BY `商品名`; 
#  さらにこの結果をループ 
#  SELECT SUM(個数) FROM 売り上げ WHERE 商品ID=? 
#   
#  これだと時間がかかりすぎるので、これを1つ、または2つのSQLにまとめたいです。 
#   
#   
#  SELECT *, SUM(`売り上げ`.個数`) AS `売り上げ個数合計` 
#  FROM `商品` 
#  LEFT JOIN `売り上げ` ON `商品`.`商品ID` = `売り上げ`.`商品ID` 
#  WHERE `商品`.`店舗ID`=? 
#   
#  とりあえず下2つだけでもまとめようとしてみたのですが、合計が商品毎ではなく店舗毎の合計になってしまいます。 
#   
# 
# 

'店舗名・商品名を鍵として売り上げ個数合計を集約する'(_店舗名,_商品名,_売り上げ個数合計) :-
'店舗名・商品名を鍵ならびとする'(LL1),
'店舗名・消費名を鍵に売り上げ個数合計を集約する'(LL1,LL2),
member([_店舗名,_商品名,_売り上げ個数合計],LL2).

'店舗名・商品名を鍵ならびとする'(LL1) :-
setof([_店舗名,_商品名],[_店舗ID,_店舗名,_商品ID,_商品名] ^ (
'店舗・商品から_店舗名,_商品名の対を得る'(_店舗ID,_店舗名)),LL1).

'店舗・商品から_店舗名,_商品名の対を得る'(_店舗名,_商品名) :-
店舗(_店舗ID,_店舗名),
商品(_商品ID,_店舗ID,_商品名).

'店舗名・消費名を鍵に売り上げ個数合計を集約する'(LL1,LL2) :-
findall([_店舗名,_商品名,_売り上げ個数合計],(
member([_店舗名,_商品名],LL1),
度数('店舗名・商品名を鍵に売り上げ'(_店舗名,_商品名),_売り上げ個数合計)),LL2).

'店舗名・商品名を鍵に売り上げ'(_店舗名,_商品名) :-
店舗(_店舗ID,_店舗名),
商品(_商品ID,_店舗ID,_商品名).

度数(_目標,_度数) :-
findall(1,_目標,L),
length(L,_度数).