このディレクトリの索引

# 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), 親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_資産,_親資産,_自分を含めた兄弟人数,_親の資産を子供に分配して各々の子供の資産と合わせた額). 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_資産,_親資産,_自分を含めた兄弟人数,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数).