使用言語は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
知識不足のため私には複雑すぎて悩んでいる状況なので、
どなた様か知識がある方にご教授願いたく思います。
また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、
他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、
ご教授いただけると助かります。
説明が分かりづらく表が見づらくて申し訳ございませんが、
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
うひゃー、まるでパズルのようですね。
検索条件は必ずワンセットだけですか、とか、細かいデータの入り方が不明ですが、今回の例なら以下のようにできます。
最初のワークテーブルに入れているところから、より検索に向いたテーブル構造が何かも察して頂けるのではと期待します。
(検索対象がresulttblに、検索条件はsrchtblに1行だけとしてみてください)
DECLARE @res TABLE ([ID][int],[CAT][varchar](1),[VAL][varchar](3))
DECLARE @srch TABLE ([CAT][varchar](1),[VAL][varchar](3))
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
おぉぉぉ~~~
すばらしいです。さすがです。
分かりずらい説明の中、ありがとうごいます。
私の望んでいた通りの結果が出力されました。
組み立て方の発想の問題なんですね。
頭の中がぐちゃぐちゃになり訳の分からないことになっていました。
再度見直し勉強させていただきます。
また、その他アドバイスがありましたら宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文の長さ制限について
-
IDとパスワードについて。
-
selectの単純繰り返し
-
Accessの構成をコピーしたい
-
データベース ユーザの「このユ...
-
SELECTした結果に行番号を求めたい
-
新宿、池袋付近でお勧めの焼き...
-
truncate tableを使って複数の...
-
PostgreSQLのUPDATE文につきまして
-
【エクセル/excel】if関数とフラグ
-
sqlite select 表示されない
-
PHP+SQL在庫集計で在庫の累計が...
-
ストアドプロシジャーでDBの自...
-
SELECTした結果をSELECTしたい!
-
MySQL: 複数テーブルのcount
-
フラグをたてるってどういうこ...
-
SELECT文で足し算をした場合、N...
-
CPRM decrypterのエラーコード...
-
現在、VBAにてUNICODEのCSVを出...
-
ご覧ください、ご参照ください...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
joinの場合のテーブル名の別名...
-
2つの列からの最大値取得
-
複数行の結果を単一列に連結
-
SQLで期間をずらした集計処理
-
SQLのこと:distinctして並び替...
-
SQL文の長さ制限について
-
Postgresql Mecabでの解析について
-
SQLで2年連続で値が上昇した年...
-
PostgreSQL で自動採番する方法
-
SQL 複数条件を設定
-
SQL 複数条件を設定
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
スキーマ
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
Accessで今日から5日後
-
timestampのデータはどのように...
-
UPDATEで既存のレコードに文字...
おすすめ情報