このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/881
#  入庫、出庫、締め用のテーブルがあるとし、それぞれ、HEADER、DETAILがあり 
#  HEADERには、入出庫、締め番号、日付、ACTIVE(該当月Y/N)など 
#  DETAILには、アイテムと数量が入っているとします 
#  そこでDAILY MOVEMENTを作成したいのですが、 
#  1~31のように固定ではなく、トランザクションがあった日のみ、つまり 
#  SELECT TRANS_DATE FROM 
#  (SELECT TRANS_DATE FROM INCOMING WHERE ACTIVE='Y' 
#  UNION ALL 
#  SELECT TRANS_DATE FROM OUTGOING WHERE ACTIVE='Y') T_DATE 
#  group by TRANS_DATE ORDER BY 1 
#  でTRANS_DATE抽出しておきます 
#  結果をREPORT WRITEとかWEBを用いずに 
#  TRANS_DATEが横方向に1行目に表され、 
#  2行目1カラムは、アイテム、2カラム目はOPENING数量で、 
#  3カラム以降はIN又はOUTの数量を表記したいのですが 
#  JUL/8はトランザクションがありませんので表記されていません 
#  最後のカラムは、その月の現在までのSUMMARY 
#   
#    JUL/7  JUL/9           JUL 
#      IN OUT  IN OUT                   IN OUT CLOSE 
#     3  5     3                     3  8  15 
#   
#  みなさんなら、どうSQLを書きますか、教えてください 
# 
# 
%
%  入庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量).
%
%  出庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量).
%
%  締め用(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量).
%

みなさんならどう書きますか :-
        重複のない入出庫日付ならび(_重複のない入出庫日付ならび),
        表を作成する(_重複のない入出庫日付ならび,_表),
        '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計),
        転置(_表,_転置された表),
        表を出力する(_転置された表,_入庫数量合計,_出庫数量合計,_締め用数量合計).

重複のない入出庫日付ならび(_重複のない入出庫日付ならび) :-
        setof(_日付_1,[_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量] ^ (
                    入庫(_入出庫,_締め番号,_日付_1,'Y',_アイテム,_数量)),_入庫日付ならび),
        setof(_日付_2,[_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量] ^ (
                    出庫(_入出庫,_締め番号,_日付_2,'Y',_アイテム,_数量)),_出庫日付ならび),
        append(_入庫日付ならび,_出庫日付ならび,_入出庫日付ならび),
        setof(_日付,member(_日付,_入出庫日付ならび),_重複のない入出庫日付ならび).

表を作成する(_重複のない入出庫日付ならび,_表) :-
        findall([_日付,_入庫数量,_出庫数量],(
                    member(_日付,_重複のない入出庫日付ならぴ),
                    入庫数量を得る(_日付,_入庫数量),
                    出庫数量を得る(_日付,_出庫数量),
                    表示パターン(_入庫数量,_出庫数量,_表示パターン)),
                _表).

入庫数量を得る(_日付,_入庫数量) :-
        入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_入庫数量),!.
入庫数量を得る(_日付,0.0).

出庫数量を得る(_日付,_出庫数量) :-
        入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_出庫数量),!.
出庫数量を得る(_日付,0.0).

'入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :-
        findsum(_数量,(
                    入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)),
                _入庫数量合計),
        findsum(_数量,(
                    出庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)),
                _出庫数量合計),
        findsum(_数量,(
                    締め用(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)),
                _締め用数量合計).

表示パターン(_入庫数量,0.0,1) :-
        \+(_入庫数量 = 0.0),!.
表示パターン(0.0,_出庫数量,2) :-
        \+(_出庫数量 = 0.0),!.
表示パターン(_,_,3).

表を出力する([_日付ならび,_パターンならび,_入庫数量ならび,_出庫数量ならび],_入庫数量合計,_出庫数量合計,_締め用数量合計) :-
        日付を表示する(_日付ならび),
        '入庫・出庫・合計見出し'(_パターンならび),
        数量ならびを表示する(_入庫数量ならび,_出庫数量ならび),
        '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計).

日付を表示する([]) :-
        write('\n').
日付を表示する([_日付|R]) :-
        日付表示文字列(_日付,_日付表示文字列),
        write('%12c',[_日付表示文字列]),
        日付を表示する(R).

日付表示文字列(_日付,_日付表示文字列) :-
        sub_atom(_日付,4,2,_月),
        sub_atom(_日付,6,2,_日),
        atomic_list_concat([_月,'/',_日],_日付表示文字列).

'入庫・出庫・合計見出し'([]) :-
        writef(' 入庫 出庫 締め用 \n').
'入庫・出庫・合計見出し'([_パターン|R]) :-
        '入庫・出庫・合計見出し表示文字列'(_パターン,_表示文字列),
        writef('%t',[_表示文字列]),
        '入庫・出庫・合計見出し'(R).

'入庫・出庫・合計見出し表示文字列'(1,' 入庫 ').
'入庫・出庫・合計見出し表示文字列'(2,' 出庫 ').
'入庫・出庫・合計見出し表示文字列'(3,' 入庫  出庫 ').
        

数量ならびの表示([]) :-
数量ならびを表示する([_入庫|R1],[_出庫|R2]) :-
        数量表示文字列(_入庫数量,_出庫数量,_入庫表示文字列,_出庫表示文字列),
        writef(' %t %t ',[_入庫表示文字列,_出庫表示文字列]),
        数量ならびを表示する(R1,R2).

数量表示文字列(0.0,_出庫数量,'      ',_出庫表示文字列) :-
        swritef(_出荷表示文字列,' %4r ',[_出庫数量]),!.
数量表示文字列(0.0,_入庫数量,_入庫表示文字列,'      ') :-
        swritef(_入庫表示文字列,' %4r ',[_入庫数量]),!.
数量表示文字列(_入荷数量,_出庫数量,_入庫数量文字列,_出庫表示文字列) :-
        swritef(_入庫表示文字列,' %4r ',[_入庫数量]),
        swritef(_出庫表示文字列,' %4r ',[_出庫数量]),!.

'入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :-
        writef(' %4r %4r %4r\n',[_入庫数量合計,_出庫数量合計,_締め用数量合計]).