このディレクトリの索引
http://pc11.2ch.net/test/read.cgi/db/1252492296/922
#  売上データベースがあって、主テーブルの項目は、売上番号、得意先名、日付。  
#  明細テーブルの項目は、明細番号、売上番号、商品、個数。売上番号で1対多でリンクしています。  
#  商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力したいです。  
#  ただし得意先名は同名を1とカウントしたいのです。  
#  SELECT 明細.商品, Sum(明細.個数) AS 個数計, Count(主.得意先) AS 得意先計  
#  FROM 主 INNER JOIN 明細 ON 主.売上番号 = 明細.売上番号  
#  WHERE 主.日付 Between '5/1/2010' And '5/4/2010'  
#  GROUP BY 明細.商品  
#  HAVING 明細.商品='えんぴつ' or 明細.商品='筆';  
#  とすると、得意先計が複数カウント(同名は1とならない)してしまいます。  
#  どのように書いたらよいのでしょうか。 
#   

'商品(複数)と日付を指定して、 商品名  個数計  得意先計の一覧を出力する'(_商品ならび,_日付下限,_日付上限,X) :-
        findall([_商品,_個数,_得意先名],(主(_売上番号,_得意先名,_日付),明細(_明細番号,_売上番号,_商品,_個数),member(_商品,_商品ならび),_日付@>=_日付下限,_日付@=<_日付上限),_選択ならび),
        findsetof([_商品,_得意先名],member([_商品,_個数,_得意先名],_選択ならび),_鍵ならび),
        findall([_商品,_個数計,_得意先名],(member([_商品,_得意先名],_鍵ならび),findsum(_個数,member([_商品,_個数,_得意先名],_選択ならび),_個数計)),X).