このディレクトリの索引

# 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/487 # 次のようなデータがあります。 # tozai nihon # 関東 関東 # 関西 関西 # −− 関西 # 関西 関東 # −− 関東 # −− −− # 関東 関東 # 関西 関西 # # (−−)は空のデータ # # # tozaiとnihonではtozaiが優先されます。 # 例えば、tozai=関西,nihon=関東となっていた場合、tozaiが優先されるので「関西」と見なされます。 # この条件で、関東と関西のデータがそれぞれ何件あるか調査する為に次の3つのSQL文を出しました。 # これらを一つの文にまとめたいのですが、どのようにしたらよいでしょうか? # # select count(*) from hoge where tozai='関東' or (tozai='' and nihon='関東'); # 結果=3 # # select count(*) from hoge where tozai='関西' or (tozai='' and nihon='関西'); # 結果=4 # # select count(*) from hoge where tozai='' and nihon=''; # 結果=1 # # 'tozaiとnihonではtozaiが優先されます。 例えば、tozai=関西,nihon=関東となっていた場合、tozaiが優先されるので「関西」と見なされます。 この条件で、関東と関西のデータがそれぞれ何件あるか調査する為に次の3つのSQL文を出しました。 これらを一つの文にまとめたいのですが、どのようにしたらよいでしょうか?'(_関東,_関西,_どちらでもない) :- findall([N1,N2,N3], 'hogeのtozai,nohonからhoge_tableの値をえる'(N1,N2,N3),LL), 縦列を合計する(LL,_関東,_関西,_どちらでもない). 'hogeのtozai,nohonからhoge_tableの値をえる'(N1,N2,N3) :- hoge(_tozai,_nihon), hoge_select(_tozai,_hihon,N1,N2,N3). 縦列を合計する(LL,_関東,_関西,_どちらでもない) :- 転置(LL,[L1,L2,L3]), '転置された三つの行から_関東,_関西,_どちらでもないを求める'(L1,L2,L3,_関東,_関西,_どちらでもない). '転置された三つの行から_関東,_関西,_どちらでもないを求める'(L1,L2,L3,_関東,_関西,_どちらでもない). '転置された1行目の合計が_関東となる'(L1,_関東), '転置された2行目の合計が_関西となる'(L2,_関西), '転置された3行目の合計が_どちらでもないとなる'(L3,_どちらでもない), '転置された1行目の合計が_関東となる'(L1,_関東) :- sum_list(L1,_関東). '転置された2行目の合計が_関西となる'(L2,_関西) :- sum_list(L2,_関西). '転置された3行目の合計が_どちらでもないとなる'(L3,_どちらでもない) :- sum_list(L3,_どちらでもない). hoge_select('','',0,0,1). hoge_select('',関東,1,0,0). hoge_select('',関西,0,1,0). hoge_select(関東,_,1,0,0). hoge_select(関西,_,0,1,0). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4).