このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/92
#  環境はoracle9iです。 
#   
#  ■テーブルの構成 
#  |年度|月|部署コード|商品コード|金額| 
#   
#  ■テーブルの内容 
#  |2010|01|AAA|001|1000| 
#  |2010|02|AAA|001|2000| 
#  |2010|01|AAA|001|3000| 
#  |2010|01|AAA|002|3000| 
#  |2010|02|BBB|003|4000| 
#  |2010|01|CCC|001|5000| 
#  |2010|03|CCC|001|6000| 
#   
#  上記のようなテーブルがあり、 
#  これを
#  と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 
#  そこに年度,部署コード,商品コードでサマリした 
#  「累計金額」列を加える必要があります。(イメージは下記のとおりです。) 
#   
#   
#  ■抽出結果の構成 
#  |年度|月|部署コード|商品コード|金額|累計金額| 
#   
#  ■抽出結果の内容 
#  |2010|01|AAA|001|4000|6000| 
#  |2010|02|AAA|001|2000|6000| 
#  |2010|02|BBB|003|4000|4000| 
#  |2010|01|CCC|001|5000|11000| 
#  |2010|03|CCC|001|6000|11000| 
#   
#   
#  GROUP BYと別の集計単位で列を作ることが可能か、 
#  可能であればどのようなSQLを書くべきか、 
#  というところを教えてください。 
# 
# 

'|年度|月|部署コード|商品コード|金額| テーブルを年度,月,部署コード,商品コードでサマリした値にさらに年度,部署コード,商品コードでサマリした値を付加した行表示' :-
        鍵ならびの生成([_年度,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの一),
        鍵ならびの生成([_年度,_月,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの二),
        append(_,[[_年度,_部署コード,_商品コード]|R],_鍵ならびの一),
        金額制約(_鍵ならびの二,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計),
        writef('|%t|%t|%t|%t|%t|%t\n',[_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計]),
        R = [].

金額集約(L2,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計) :-
        年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額総合計),
        append(_,[[_年度,_月,_部署コード,_商品コード]|_],L2),
        年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額月合計).

年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額合計) :-
        findsum(_金額,(
                    テーブル(_年度,_月,_部署コード,_商品コード,_金額)),
                _年度・月・部署コード・商品コード集約).

年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額合計) :-
        findsum(_金額,(
                    テーブル(_年度,_月,_部署コード,_商品コード,_金額)),
                _年度・部署コード・商品コード集約).

鍵ならびの生成(_鍵変数ならび,_述語,_鍵ならび) :-
        findsetof(_鍵変数ならび,_述語,_鍵ならび).