使用言語は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のこと:distinctして並び替...
-
2つの列からの最大値取得
-
IDとパスワードについて。
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
pandasでsqlite3にテーブル作成...
-
テーブル名が可変の場合のクエ...
-
フラグをたてるってどういうこ...
-
エラーを起こす方法
-
PostgreSQLのtimestamp型で時間...
-
テーブル定義書(Oracle) 【IX】...
-
ACCESS テキストボックスに入...
-
ExcelのMatch関数のようなもの...
-
プログラムよりファンクション...
-
SELECT文の結果をDEFINEの値と...
-
sqlに記述できない文字
-
SELECTした結果に行番号を求めたい
-
SQL SERVERの BULK INSERT
-
実行時エラー:2517 プロシージ...
-
UPDATEで既存のレコードに文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
joinの場合のテーブル名の別名...
-
2つの列からの最大値取得
-
複数行の結果を単一列に連結
-
SQLのこと:distinctして並び替...
-
postgreSQLのupdateについて
-
SQL 複数条件を設定
-
access2000のクエリについて
-
SQLで期間をずらした集計処理
-
SQL文の長さ制限について
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
結合したテーブルをSUMしたい
-
Accessで今日から5日後
おすすめ情報