![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
http://oshiete1.goo.ne.jp/qa4165327.html
先日上記の質問をさせていただいたのですが、
検索条件が2セットになり、またまた困っている状況です。
前回通り、検索条件間、グループ間での逆転等はOKです。
度々申し訳ないですが、どなた様か知識がある方にご教授願いたく思います。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
あのテーブル構造のままやっているんですか?
力技でクエリを書かないといけない場合は、通常テーブル構造に問題があります。
検索条件が2件以上になる場合、一致の数え方により多少変わってくると思いますが、
・検索条件に全く同じ2レコード(aaa,bbb,ccc,ddd,eee,fffが2行)があった場合には単純に一致数は倍になるのですか?
・前回書いたクエリではたとえばa1とa2に両方同じ値が入っていたとしても一致数は1とカウントするように書きましたが、そこはどうなんでしょう。検索条件1のa1にaaaがあって、検索条件2のa2にもaaaがあると一致数が2ならば、検索条件1のa1,a2の両方にaaaがあっても一致数は2でよいのかなと思えます。
いずれにせよ、内容は大きくは変わりません。
最初に検索条件をまとめてあげるやり方を変えるだけだからです。
DECLARE @res TABLE ([ID][int],[CAT][varchar](1),[VAL][varchar](3))
DECLARE @srch TABLE ([CAT][varchar](1),[VAL][varchar](3),[CNT][int])
INSERT INTO @res
SELECT ID, 'a' CAT,a1 VAL FROM resulttbl
UNION ALL
SELECT ID, 'a' CAT,a2 VAL FROM resulttbl
UNION ALL
SELECT ID, 'b' CAT,b1 VAL FROM resulttbl
UNION ALL
SELECT ID, 'b' CAT,b2 VAL FROM resulttbl
UNION ALL
SELECT ID, 'c' CAT,c1 VAL FROM resulttbl
UNION ALL
SELECT ID, 'c' CAT,c2 VAL FROM resulttbl
INSERT INTO @srch
SELECT CAT,VAL,COUNT(*)
FROM
(SELECT 'a' CAT,a1 VAL FROM srchtbl
UNION ALL
SELECT 'a' CAT,a2 VAL FROM srchtbl
UNION ALL
SELECT 'b' CAT,b1 VAL FROM srchtbl
UNION ALL
SELECT 'b' CAT,b2 VAL FROM srchtbl
UNION ALL
SELECT 'c' CAT,c1 VAL FROM srchtbl
UNION ALL
SELECT 'c' CAT,c2 VAL FROM srchtbl) tmp
GROUP BY CAT, VAL
SELECT r.*,ISNULL(c.CNT,0)
FROM resulttbl r
LEFT OUTER JOIN
(SELECT wt.ID,
SUM(CNT) CNT,
SUM(CASE WHEN wt.CAT='c' THEN CNT 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
No.2
- 回答日時:
少し疑問なのが、前回の回答、なぜこういうつくりにしたのかわかりました?
わかって使っていないのなら、また条件が変わったときに同じように聞くとになりますよね。
いっそのこととりあえずデータをソートなしで取得して、
java側で一致件数をカウントする関数を通して、java側でソートかけたほうが楽じゃないです?
あ、それで、私ならどうするかというと、ユーザー関数を自作します。
文法はうろ覚えなのでイメージだけ
Create function Sortlank
(tbla1 varchar ,tbla2 varchar, ...
pma1_1 varchar, pma2_1 varchar,...
pma2_2 varchar,...
)
(計算して一致する数を出す)
-------
で、Select文は
select A.*,
dbo.SortLank(a-1,a-2,....,'aaa','bbb'...) as Sortkey
order by sortkey,id
みたいな感じで。
そのほうが順位付けのロジックを説明しやすいんじゃないかと。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) <条件追加/スプレッドシート>指定の日付より2か月、1.5か月前に書式設定アラートを出したい 7 2023/02/16 07:33
- LINE LINE androidスマホからiPhoneへの複数回移行について 1 2022/12/14 15:01
- Visual Basic(VBA) VBAの繰り返し処理表記と複数の処置条件について 1 2023/01/23 20:08
- その他(健康・美容・ファッション) ブルーライトカット率の高い眼鏡を作れるお店を教えて下さい 1 2023/02/10 17:43
- その他(健康・美容・ファッション) ブルーライトカット率の高い眼鏡を作れるお店を教えて下さい 4 2023/02/10 17:45
- ボランティア フリーメイソンの入会… フリーメイソンに入会できる条件 ⚫︎20歳以上の男性 ⚫︎一定以上の収入があ 1 2023/08/25 04:12
- Excel(エクセル) 条件付書式 Sheet1からSheet2に転記した時の転記ミスを反映させたい 5 2022/05/21 09:52
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- Excel(エクセル) エクセル 条件に合う日付に入力された時間数の合計したい 4 2022/06/17 22:18
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
直角三角形でもM、NはOと一致し...
-
WHERE `年月日` = '晴' OR `年...
-
PL/SQLでの文字列比較
-
LIKEの右側にカラムを指定でき...
-
whereで全てを検索する方法
-
End Ifに対応するIfブロックが...
-
スペースによる絞り込み検索をS...
-
複数カラムに対するLIKE文の最適化
-
mysqlで50音順にorder byしたい。
-
一部のカラムでdistinctし全て...
-
INDIRECT関数の代替方法は?
-
GREATESTで NULLをスルーする方...
-
テーブルの列数を調べたい
-
SQLServerでNULLを挿入したいです
-
ROUND関数で、四捨五入ができな...
-
DBの定義のサイズを大きくし過...
-
ドロップダウンリストの連動し...
-
now()かCURRENT_TIMESTAMPか
-
AUTO_INCREMENTに0はダメ?
-
sql , insert で空行(全ての列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LIKEの右側にカラムを指定でき...
-
私は相手の言葉と行動が一致し...
-
mysqlで50音順にorder byしたい。
-
スペースによる絞り込み検索をS...
-
whereで全てを検索する方法
-
複数カラムに対するLIKE文の最適化
-
End Ifに対応するIfブロックが...
-
PL/SQLでの文字列比較
-
複数キーワードを複数カラムに...
-
SQLステータス:37000について
-
LIKE演算子の%について教えて...
-
Accessで文字列の一部を抽出す...
-
キーワード \\P が部分一致で...
-
社名でデータ抽出できる検索シ...
-
SELECT、特定カラムの文字列が...
-
MySQLのあいまい検索について
-
以下の式の後の部分のMySQLのSQ...
-
エクセルで2つのセルの値が同じ...
-
MySQLで住所テーブルのLIKE検索で
-
複数のフィールドの検索
おすすめ情報