このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/635
#  宜しくお願いします。 
#   
#  ・DBMS名とバージョン  
#  Oracle10g 
#   
#  ・テーブルデータ  
#  SALES 
#  +------------+------+  
#  | 日時       | 数量 |  
#  +------------+------+  
#  | 2010/03/01 |  1   |  
#  | 2010/03/02 |  1   |  
#  | 2010/03/23 |  2   |  
#  | 2010/03/24 |  1   |  
#  | 2010/04/05 |  5   |  
#  | 2010/04/05 |  2   |  
#  +------------+------+  
#   
#  ・欲しい結果  
#  テーブルから週毎(月曜基準)に合算した数量を取得したい。 
#  但しデータがない週も0で表示したい。 
#   
#  ・説明  
#  週毎に合算した数量は以下のSQLで取得できましたが、 
#  データがない週も表示する方法がわかりません。 
#   
#  SELECT NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7 AS 日時, SUM(数量) 
#  FROM SALES 
#  GROUP BY NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7; 
#   
#  宜しくお願い致します。 

'テーブルから週毎(月曜基準)に合算した数量を取得したい。但しデータがない週も0で表示したい。'(_週区間下限,_週区間上限,_数量合計) :-
       週グループを生成(_週区間ならび),
       週区間ごとに数量を合計する(_週区間ならび,_週合計ならび),
       append(_,[[_週区間下限,_週区間上限,_数量合計]|R],_集合計ならび).

週グループを生成(_週区間ならび) :-
       findmin(_日時,'SALES'(_日時,_),_日付下限),
       findmax(_日時,'SALES'(_日時,_),_日付上限),
       最も直前の月曜日(_日付下限,_日付下限の一),
       最も直前の月曜日(_日付上限,_日付上限の一),
       findall([_月曜日,_直後の日曜日],(
                  週の切り取り(_日付下限の一,_月曜日,_日付上限の一),
                  直後の日曜日(_月曜日,_直後の日曜日)),
               _週区間ならび),
       length(_週区間ならび,Len),!.

週区間ごとに数量を合計する([],[]) :- !.
週区間ごとに数量を合計する([[_週区間下限,_週区間上限]|R1],[[_週区間下限,_週区間上限,_数量合計]|R2]) :-
        findsum(_数量,(
                    'SALES'(_日時,_数量),_数量合計),
                    _日時 @>= _週区間下限,
                    _日時 @=< _週区間上限),
                _数量合計),
        週区間ごとに数量を合計する(R1,R2).

週の切り取り(_月曜日,_月曜日,_日付上限) :- _月曜日 @=< _日付上限.
週の切り取り(_月曜日の一,_月曜日,_日付上限) :-
        直後の月曜日(_月曜日の一,_直後の月曜日),
        週の切り取り(_直後の月曜日,_月曜日,_日付上限).