このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/879
#  ・DBMS名とバージョン 
#  oracle9i / 10g 
#  ・テーブルデータ 
#        部署ID  大分類  中分類  小分類  予算 
#        -------+------+-------+------+--- 
#        01           01         01          01         2500 
#        01           02         01          01         1000 
#        01           02         02          02         100 
#        02           01         01          01         100 
#        02           01         02          02         0 
#        02           02         02          02         1000 
#        02           03         01          01         0 
#        03           01         01          01         500 
#   
#  ・欲しい結果 
#  上のテーブルの時、 
#  (大分類=01and予算>50) and (大分類=02and予算<2000) 
#  の部署IDを取得したい。 
#  ・説明 
#  とりたい結果は01,02ですが上のSQLを 
#  そのまま書くと当然結果はnullですし、 
#  括弧の間のandをorにすると03も取得されてしまいます。 
#  なにか良い方法はないでしょうか? 
# 
# 

テーブルデータ('01','01','01','01',2500). 
テーブルデータ('01','02','01','01',1000).
テーブルデータ('01','02','02','02',100).
テーブルデータ('02','01','01','01',100).
テーブルデータ('02','01','02','02',0).
テーブルデータ('02','02','02','02',1000).
テーブルデータ('02','03','01','01',0).
テーブルデータ('03','01','01','01',500). 

'(大分類=01and予算>50) and (大分類=02and予算<2000)の部署IDを取得したい'(_部署ID) :-
        findsetof([_部署ID,_大分類],(
                    テーブルデータ(_部署ID,_大分類,_,_,_)),
                  L),
        findall([_部署ID,_大分類,_予算計],(
                    append(_,[[_部署ID,_大分類]|_],L)),
                    findsum(_予算,(
                                    テーブルデータ(_部署ID,_大分類,_,_,_予算)),
                            _予算計)),
                _部署ID・大分類・予算計ならび),
        append(_,[[_部署ID,'01',_予算計_1]|_],_部署ID・大分類・予算計ならび),
        _予算計_1 > 50,
        append(_,[[_部署ID,'02',_予算計_2]|_],_部署ID・大分類・予算計ならび),
        _予算計_2 < 2000.