このディレクトリの索引

# SQL質疑応答スレ 12問目 #41 # ・DBMS名とバージョン : SQL-Server 2008 # # 売り上げ # ID | AMOUNT     | # --+---------------------- # 1,200 # 1,300 # 1,400 # 2,100 # 4,100 # 5,200 # 5,300 # 6,400 # # 得意先マスタ # ID | NAME     | OYA_CODE # --+----------------------+-------------- # 1,abc商事 本店,1 # 2,abc商事 い支店,1 # 3,abc商事 う支店,1 # 4,def工務店 本店,4 # 5,def工務店 い支店,4 # 6,ghiサービス,6 # 7,jklシステム,7 # # ・欲しい結果 # 1,abc商事 本店,900 # 4,def工務店 本店,600 # 6,ghiサービス,6 # 7,jklシステム,400 # # ・説明 # 会社ごとに、売り上げ合計を出したいです。 # 得意先マスタに親会社コードを持っているので、親会社がある場合は親会社に合算したいです。 # 自分が親会社の場合は自らのコードが入っています。 # 売上('1',200). 売上('1',300). 売上('1',400). 売上('2',100). 売上('4',100). 売上('5',200). 売上('5',300). 売上('6',400). 得意先マスター('1',abc商事本店,'1'). 得意先マスター('2',abc商事い支店,'1'). 得意先マスター('3',abc商事う支店,'1'). 得意先マスター('4',def工務店本店,'4'). 得意先マスター('5',def工務店い支店,'4'). 得意先マスター('6',ghiサービス,'6'). 得意先マスター('7',jklシステム,'7'). '会社ごとに、売り上げ合計を出す' :- 親会社ならび(_親会社ならび), 親会社ごとの合計ならび(_親会社ならび,_親会社ごとの合計ならび), 表示する(_親会社ごとの合計ならび). 親会社ならび(_親会社ならび) :- setof(_OYA_CODE,( [_ID,_NAME,_OYA_CODE] ^ 得意先マスター(_ID,_NAME,_OYA_CODE)),_親会社ならび). 親会社ごとの合計ならび(_親会社ならび,_親会社ごとの合計ならび) :- findall([_OYA_CODE,_合計],( 親会社の合計(_親会社ならび,_OYA_CODE,_NAME,_合計)),_親会社ごとの合計ならび). 親会社の合計(_親会社ならび,_OYA_CODE,_NAME,_合計) :- member(_OYA_CODE,_親会社ならび), 子会社の全合計を得る(_OYA_CODE,_NAME,_合計). 子会社の全合計を得る(_OYA_CODE,_NAME,_合計) :- 子会社ならびを得る(_OYA_CODE,_子会社ならび), findsum(_AMOUNT,子会社の売上(_子会社ならび,_ID,_AMOUNT),_合計). 子会社ならびを得る(_OYA_CODE,_子会社ならび) :- setof(_ID,[_ID,_NAME,_OYA_CODE] ^ 得意先マスター(_ID,_NAME,_OYA_CODE),_子会社ならび). 子会社の売上(_子会社ならび,_ID,_AMOUNT) :- member(_ID,_子会社ならび), 売上(_ID,_AMOUNT). 表示する([]). 表示する(LL) :- 売上合計が0でないものの表示を続ける(LL). 売上合計が0でないものの表示を続ける([[_OYA_CODE,0]|R]) :- 売上合計が0の時は飛ばして表示を続ける(R). 売上合計が0でないものの表示を続ける([[_OYA_CODE,_合計]|R]) :- 売上合計を表示する(_OYA_CODE,_合計,R). 売上合計が0の時は飛ばして表示を続ける(R) :- 表示する(R). 売上合計を表示する(_OYA_CODE,_合計,R) :- \+(_合計=0), writef('%w,%w\n',[_OYA_CODE,_合計]), 表示する(R). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C).