質問: sql 複数条件を設定 使用言語はjavaで処理しており、 sql server2005にて下記のようなテーブル(t_kekka)があります。 id a-1 a-2 b-1 b-2 c-1 c-2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd ccc eee fff 2 ggg bbb ccc hhh iii jjj 3 bbb mmm ddd ccc fff eee 4 bbb aaa ccc ddd qqq rrr 5 zzz sss ttt ccc vvv xxx 6 zzz aaa ttt ccc vvv fff 7 zzz zzz zzz zzz zzz zzz 8 qqq rrr ccc ddd fff eee 検索する値は下記の通りです。 検索値 |a-1|a-2|b-1|b-2|c-1|c-2| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |aaa|bbb|ccc|ddd|eee|fff| 期待値としては、aはaのグループで検索、bはbのグループで検索、cはcのグループで検索をし、 一致個数の多い順に出力したいと考えております。(理想は下記のような感じです。) また、グループ内であれば逆転していてもokです。 (例えばid:1のaグループのような感じです。) *1 一致数が同じ場合はcグループの数が多いデータが最優先となり、その他はid順になります。 期待値 id a-1 a-2 b-1 b-2 c-1 c-2 一致数 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd ccc eee fff 6 3 bbb mmm ddd ccc fff eee 5 8 qqq rrr ccc ddd fff eee 4・・・*1 4 bbb aaa ccc ddd qqq rrr 4 6 zzz aaa ttt ccc vvv fff 3 2 ggg bbb ccc hhh iii jjj 2 5 zzz sss ttt ccc vvv xxx 1 7 zzz zzz zzz zzz zzz zzz 0 知識不足のため私には複雑すぎて悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。 また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、 他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、 ご教授いただけると助かります。 説明が分かりづらく表が見づらくて申し訳ございませんが、 宜しくお願い致します。
回答: うひゃー、まるでパズルのようですね。 検索条件は必ずワンセットだけですか、とか、細かいデータの入り方が不明ですが、今回の例なら以下のようにできます。 最初のワークテーブルに入れているところから、より検索に向いたテーブル構造が何かも察して頂けるのではと期待します。 (検索対象がresulttblに、検索条件はsrchtblに1行だけとしてみてください) declare @res table (id][int],[cat][varchar,val][varchar) declare @srch table (cat][varchar,val][varchar) insert into @res select id,'a' cat,a1 val from resulttbl union all select id,'a',a2 from resulttbl union all select id,'b',b1 from resulttbl union all select id,'b',b2 from resulttbl union all select id,'c',c1 from resulttbl union all select id,'c',c2 from resulttbl insert into @srch select cat,val from (select 'a' cat,a1 val from srchtbl union all select 'a',a2 from srchtbl union all select 'b',b1 from srchtbl union all select 'b',b2 from srchtbl union all select 'c',c1 from srchtbl union all select 'c',c2 from srchtbl) tmp group by cat,val select r.*,isnull(c.cnt,0) from resulttbl r left outer join (select wt.id, count(*) cnt, sum(case when wt.cat='c' then 1 else 0 end) cnt_c from @res wt inner join @srch ws on ws.cat=wt.cat and ws.val=wt.val group by wt.id) c on c.id=r.id order by cnt desc,cnt_c desc