このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/721
#  ユーザ毎に各商品を何点購入、合計何点購入したかを集計するSQLがうまく書けず悩んでおります。 
#  下記のようなテーブルを想定しております。 
#   
#  Shohinテーブル 
#  商品id, 商品名 
#  sid, sname 
#  1, "商品A" 
#  2, "商品B" 
#  3, "商品C" 
#  4, "商品D" 
#   
#  Userテーブル 
#  ユーザid, ユーザ名 
#  uid, uname 
#  1, "ユーザA" 
#  2, "ユーザB" 
#  3, "ユーザC" 
#   
#  Rirekiテーブル(購入履歴) 
#  rid,uid, sid, kazu 
#  1,  2,  3,  2 
#  2,  1,  1,  1 
#  3,  3,  2,  4 
#   
#  Shohinテーブルの商品,Userテーブルのユーザは追加・削除される可能性があります。 
#   
#  このような場合に下のように集計結果を得るにはどのようなSQLを書けばよいでしょうか。 
#   
#  集計結果 
#  ユーザ名  商品A  商品B  商品  商品D  … 合計 
#  ユーザA       1      2     0      2       5 
#  ユーザB       3      1     2      2       8 
#  ユーザC       0      2     0      0       2 
#  … 
#   
#  使用予定のデータベースはMySQL 5.0です。 
#  何卒よろしくお願い致します。 
# 
# 

'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する' :-
        見出し表示,
        行表示フォーマット(_行表示フォーマット),
        forall(
                  'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する'(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計),
                  ユーザ合計表示(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計)).

'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する'(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計) :-
        ユーザ毎に(_uid,_uname),
        findall(_何点,(
                    '各商品を何点購入、'(_uid,_何点)),
                _各商品何点),
        合計何点購入したか(_各商品何点,_合計何点).

ユーザ毎に(_uid,_uname) :-
        user(_uid,_uname).

'各商品を何点購入、'(_uid,_何点) :-
        shohin(_sid,_),
        findsum(_kazu,(
                    rireki(_,_uid,_sid,_kazu),
                _何点).

合計何点購入したか(_各商品何点,_合計何点) :-
        sumlist(_各商品何点,_合計何点).

見出し表示 :-
        見出し項目ならび(_見出し項目ならび),
        見出し表示フォーマット(_見出し表示フォーマット),
        writef(_見出し表示フォーマット,_見出し項目ならび).

見出し項目ならび(_見出し項目ならび) :-
        findall(_sname,(
                    shohin(_sid,_sname)),
                _商品名ならび),
        append(_商品名ならび,[合計],_見出し項目ならび).

見出し表示フォーマット(_見出し表示フォーマット) :-
        findall('%8r',shohin(_,_),L1),
        atomic_list_concat(L1,S1),
        atomic_list_concat(['        ',S1,'%8r'],_見出し表示フォーマット).

行表示フォーマット(_行表示フォーマット) :-
        findall('%8r',shohin(_,_),L1),
        atomic_list_concat(L1,S1),
        atomic_list_concat(['%8l',S1,'%8r\n'],_行表示フォーマット).

ユーザ合計表示(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計) :-
        append([_uname|_商品合計ならび],[_ユーザ毎総合計],L),
        writef(_行表示フォーマット,L),!.

findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        sumlist(_値ならび,_合計値),!.