このディレクトリの索引

# 出典 :: < A HREF="http://hibari.2ch.net/test/read.cgi/db/1274791771/967">SQL質疑応答スレ 10問目 #967 # # ■DBMS名とバージョン # Firebird 1.03 # ■テーブルデータ (注文データベースのようなものです) # ・Main 主情報テーブルMIDがキー # MID HACCHUBI # 1 2011/03/01 # ・DETAIL 明細テーブルDIDがキー MID,IIDが参照キー # DID MID IID KOSU # 1  1  1  100 # 2  1  2  30 # ・ITEM 商品テーブルIIDがキー # IID NAMAE ZAIKO OPOINT BIKO # 1  HOGE  20  10   0 # 2  HUGA  50  5    1 # ■欲しい結果 # 2011/1/1から1/31の注文のあった各アイテムの個数(DETAIL.KOSU)の平均値が10以上の場合、 # 該当するアイテムの注文ライン(ITEM.OPOINT)に、その平均値を入れて更新。平均値が10未満の場合、 # ITEM.OPOINTに0を入れる。ただしアイテムの備考(ITEM.BIKO)が1の場合は、ITEM.OPOINTには # 空欄(NULL)にする。 # ■説明 # といいますか、上記の欲しい結果が全てなのですが、どう書いていいのかちょっと見当がつきません。 # 在庫の仕入れをする個数(ITEM.OPOINT)の設定をコンピュータにさせようとしているのですが・・・。 # 丸投げで申し訳ありませんが、どなたかお願いします。 'Main'(1,'20110301'). 'DETAIL'(1,1,1,100), 'DETAIL'(2,1,2,30). 'ITEM'(1,'HOGE',20,10,0). 'ITEM'(2,'HUGA,50,5,1). '2011/1/1から1/31の注文のあった各アイテムの個数(DETAIL.KOSU)の平均値が10以上の場合、該当するアイテムの注文ライン(ITEM.OPOINT)に、その平均値を入れて更新。平均値が10未満の場合、ITEM.OPOINTに0を入れる。ただしアイテムの備考(ITEM.BIKO)が1の場合は、ITEM.OPOINTには空欄(NULL)にする' :- findsetof(_MID,( 'Main'(_MID,_HACCHUBI), _HACCHUBI @>= '20110101', _HACCHUBI @=< '20110131'),L1), findsetof(_IID,( 'DETAIL'(_DID,_MID,_IID,_KOSU), append(_,[_MID|_],L1)),L2), append(_,[IID|R],L2), findavg(_KOSU,( 'DETAIL'(_DID,_MID,_IID,_KOSU), append(_,[_MID|_],L1)),AVG), 'ITEM更新'(IID,AVG), R = []. 'ITEM更新'(IID,AVG) :- retract('ITEM'(_IID,_NAMAE,_ZAIKO,_OPOINT,'1')), assertz('ITEM'(_IID,_NAMAE,_ZAIKO,'',_BIKO)),!. 'ITEM更新'(IID,AVG) :- AVG >= 10, atom_number(S,AVG), retract('ITEM'(_IID,_NAMAE,_ZAIKO,_OPOINT,_BIKO)), assertz('ITEM'(_IID,_NAMAE,_ZAIKO,S,_BIKO)),!. 'ITEM更新'(IID,AVG) :- AVG < 10, retract('ITEM'(_IID,_NAMAE,_ZAIKO,_,_BIKO)), assertz('ITEM'(_IID,_NAMAE,_ZAIKO,'0',_BIKO)),!.