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ランキング
-
LIKEの右側にカラムを指定でき...
-
PL/SQLでの文字列比較
-
複数カラムに対するLIKE文の最適化
-
一部のカラムでdistinctし全て...
-
INDIRECT関数の代替方法は?
-
SQLServerでNULLを挿入したいです
-
SELECT文で、指定カラム以外の...
-
BULK INSERT時のNull許容について
-
now()かCURRENT_TIMESTAMPか
-
テーブルの列数を調べたい
-
group byで最後のレコードを抽...
-
DBの定義のサイズを大きくし過...
-
Accessの「IIF」に相当するSQL...
-
SQLでカラムを追加し、条件に合...
-
構造が異なる二つのテーブルをu...
-
ROUND関数で、四捨五入ができな...
-
UNIONする際、片方テーブルしか...
-
カラムとコラムの使い分け
-
DB2のBLOB型カラムに格納された...
-
データの暗号化について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LIKEの右側にカラムを指定でき...
-
スペースによる絞り込み検索をS...
-
mysqlで50音順にorder byしたい。
-
whereで全てを検索する方法
-
複数キーワードを複数カラムに...
-
PL/SQLでの文字列比較
-
複数カラムに対するLIKE文の最適化
-
LIKE演算子の%について教えて...
-
End Ifに対応するIfブロックが...
-
SQLステータス:37000について
-
MySQLのあいまい検索について
-
Accessで文字列の一部を抽出す...
-
SQLの範囲置換の文について
-
Access & ADOで「'」のLIKE検索
-
MySQLで複数フィールドから同一...
-
SELECT、特定カラムの文字列が...
-
場合の数 中学入試 5枚のカード
-
スペース区切りの検索について
-
Like "*あ*"は、何一致というの...
-
MySQL 配列もどきを条件式に
おすすめ情報