このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/647
#  #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 
#   
#  -- 
#  -- 商品テーブルと、 
#  -- 
#  create table items ( 
#    id      serial        primary key, 
#    name    varchar(255)  not null, 
#    price   integer       not null   -- 単価 
#  ); 
#   
#  -- 
#  -- 販売テーブルがあるとする。 
#  -- 
#  create table sales ( 
#    id          serial        primary key, 
#    item_id     integer       not null references items(id), 
#    count       integer       not null default 1,  -- 個数 
#    total       integer       not null,  -- 単価 * 個数 
#    created_at  timestamp     not null default current_datetime 
#  ) 
#   
#  -- 
#  -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 
#  -- どういうSQLを書けばいいの? 
#  -- こんなかんじで書けたらいいんだけど。 
#  -- 
#  select items.id, items.name 
#  from items, 
#       (select item_id, sum(total) as sum_total 
#        from sales 
#        where date(created_at) = '2012-04-01' 
#        group by item_id) as totals 
#  where items.id = totals.item_id 
#  order by totals.sum_total desc; 
#   
#   

'日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :-
        '日付を指定して、'(_日付),
        その日の商品別販売金額合計を(_日付,L1),
        大きい順に表示する(L1).

'日付を指定して、'(_日付) :-
        write('日付を8桁の整数で入力して下さい : '),
        get_line(Line),
        '日付を指定して、の診断'(Line,_日付),!.
'日付を指定して、'(_日付) :-
        '日付を指定して、'(_日付).

'日付を指定して、の診断'(Line,_日付) :-
        atom_to_term(Line,_8桁の整数,_),
        '8桁の整数'(_8桁の整数),
        '8桁の整数から日付を得る'(_8桁の整数,_日付),!.
'日付を指定して、の診断'(Line,_日付) :-
        writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]),
        fail.

'8桁の整数'(_8桁の整数) :-
        integer(_8桁の整数),
        _8桁の整数 >= 10000000,
        _8桁の整数 =< 99999999.

'8桁の整数から日付を得る'(_8桁の整数,_日付) :-
        swritef(_日付文字列,'%t',[_8桁の整数]),
        sub_atom(_日付文字列,0,4,_,_年),
        sub_atom(_日付文字列,4,2,_,_月),
        sub_atom(_日付文字列,6,2,_,_日),
        atomic_list_concat([_年,'-',_月,'-',_日],_日付),!.

その日の商品別販売金額合計を(_日付,L1) :-
        findsetof(_id,(
                    sales(_id,_item_id,_count,_total,_日付)),
                L),
        findall([_total,_id],(
                    append(_,[_id|R],L),
                    商品の販売合計(_日付,_id,_合計金額)),
                L1).

商品の販売合計(_日付,_id,_合計金額) :-
        findsum(_total,(
                    sales(_id,_item_id,_count,_total,_日付)),
                _合計金額).

大きい順に表示する(L1) :-
        大きい順に(L1,L2),
        表示する(L2).

大きい順に(L1,L2) :-
        sort(L1,L3),
        reverse(L3,L2).

表示する(_日付,[]).
表示する(_日付,[[_合計金額,_id]|R]) :-
        items(_id,_name,_price),        
        writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]),
        表示する(_日付,R).