- ベストアンサー
複数の条件
名前 G番号 G連番 数量 チーム AAA 1 1 80 1 AAA 2 1 99 1 AAA 3 1 98 1 AAA 3 2 60 1 AAA 4 1 99 1 AAA 4 2 97 1 BBB 1 1 22 2 BBB 2 1 19 2 BBB 2 2 99 2 BBB 3 1 50 2 CCC 1 1 99 1 CCC 2 1 99 1 DDD 1 1 99 1 DDD 2 1 99 1 DDD 1 1 99 2 DDD 2 1 99 2 以上のようなテーブル T_Aがあるとして、以下のような優先順位での抽出条件を考慮した場合のSQL記述方法が分かりません。教えていただけますでしょうか。 名前 "AAA" OR "DDD" ↓ チーム "1" ↓ G番号 "最大"のもの ↓ G連番 "最大"のもの 欲しいレコード 名前 G番号 G連番 数量 チーム AAA 4 2 97 1 DDD 2 1 99 1 以下のようにやってみましたが駄目でした。 SELECT 名前,G番号,G連番,数量,チーム FROM T_A WHERE 名前='AAA' OR 名前='DDD' AND チーム='1' AND (G番号=(SELECT MAX(G番号) FROM T_A)) AND (G連番=(SELECT MAX(G連番) FROM T_A)) 宜しく御願いいたします。
- cave1
- お礼率78% (15/19)
- その他(データベース)
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
抽出条件を考えて書いたSQLはこうなります。 SELECT 名前,G番号,G連番,数量,チーム FROM T_A WHERE (名前='AAA' OR 名前='DDD') AND チーム='1' AND (G番号=(SELECT MAX(G番号) FROM T_A))AND (G連番=(SELECT MAX(G連番) FROM T_A)) 欲しいレコードから考えて書くとSQLはこうなりました。 SELECT 名前, G番号, G連番, 数量, チーム FROM T_A WHERE チーム='1' AND ((名前='AAA' and G番号=(SELECT MAX(G番号) FROM T_A where 名前='AAA') AND G連番=(SELECT MAX(G連番) FROM T_A where 名前='AAA')) OR (名前='DDD' and G番号=(SELECT MAX(G番号) FROM T_A where 名前='DDD') AND G連番=(SELECT MAX(G連番) FROM T_A where 名前='DDD')));
その他の回答 (1)
名前='AAA' OR 名前='DDD' の部分を (名前='AAA' OR 名前='DDD') にしてもダメですか? 記載のままでは、名前='AAA'の時か、その右側の条件の ものが選択されるのでは?
お礼
ORの扱い方を間違えてました。 ただ、これだと最終的にAAAのG番号とDDDのG番号の比較を行ってしまいAAAの分しか抽出しませんでした。funahoさんから教えていただいたようにAAAとDDDを別々に処理することで解決できました。 有難うございました。
関連するQ&A
- SQL 複数条件を設定
PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1 a-2 b-1  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd 2 ggg bbb ccc 3 bbb mmm ddd 4 ggg mmm ccc : TABLE2 a-1 a-2 c-1  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa eee 2 ggg mmm qqq : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1 a-2 b-1 c-1  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd eee 2 ggg bbb ccc ※ 3 bbb mmm ddd ※ 4 ggg aaa ccc qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。
- ベストアンサー
- PostgreSQL
- WHERE句の条件の記述の順序
PRIMARY KEYとINDEXがテーブルに設定されている場合、 検索条件に記述する順番はどのようになるのでしょうか? 下記のテーブルがあり、SELECT文をつくろうと 考えています。 テーブル:foo 項目 PRIMARY KEY INDEX ----------------------------------- a 1 b 2 1 c 3 d 2 (1)PRIMARY KEYを優先してWHERE句の順番を決める↓ SELECT * FROM foo WHERE a = "AAA" AND b = "BBB" AND c = "CCC" AND d = "DDD" (2) それともINDEXが設定されている項目を先に記述する↓ SELECT * FROM foo WHERE b = "BBB" AND d = "DDD" AND a = "AAA" AND c = "CCC" (1)と(2)ではどちらの性能がよいのでしょうか?
- ベストアンサー
- Oracle
- 複数のテーブルの全てのカラムを一度に検索するには?
検索対象のカラムがid(主キー)、bc1~bc40と41個あります。 1つのテーブルに41個のカラムを作り検索させると非常に時間がかかります。 それにインデックスを全部に付けたいですが16個までしかつけられないです。 なので、5つのテーブルにカラムを分けて全部のカラムにインデックスをつけて それぞれを検索させようと思っています。 テーブルが1つだけなら SELECT * FROM `bc` WHERE `bc1`='あいうえおかき' AND `bc2`='あいうえおかき' AND `bc3`='あいうえおかき' AND ・・・ `bc39`='あいうえおかき' AND `bc40`='あいうえおかき' ORDER BY `bc33` DESC LIMIT 0,50; のようにできますが、テーブルが複数の場合はどうしたらよいのでしょうか。 検索を試す前に下記ができるか試してみました。 SELECT COUNT(*) FROM (((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id`) INNER JOIN `eee` ON `ccc`.`id`=`eee`.`id` エラーにはなりませんがカウント数が0になってしまいました。 SELECT COUNT(*) FROM (`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id` これは正確にできてカウント数100000 SELECT COUNT(*) FROM ((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id` 4つ目のテーブルを入れたところから無理なようです。 他に良い方法はないのでしょうか。
- ベストアンサー
- MySQL
- 複数のテーブルを使ってselectしたい
以下のようなことをしようと思っていますが、いろいろやってみてもできなかったのでお尋ねします。 ログインのログを集計しています。 テーブルの構成は大まかには ID logintime aaa 2004-11-10 10:10:10 bbb 2004-11-10 10:10:11 ccc 2004-11-10 10:10:12 aaa 2004-11-10 10:10:13 aaa 2004-11-10 10:10:14 という構成です。 これが1日ごとに、 log_20041108 log_20041109 log_20041110 log_20041111 という感じで並んでいます。 それで、やりたいことは「ユニークログイン数のカウント」です。 1日であれば > select count(distinct id) from log_20041111; などでできると思うのですが、 (上記の例で行くとこれは3になりますね。) これをイメージ的には > select count(distinct id) from log_20041111,log_20041110,log_20041109; のように、複数のテーブルでやりたいのです。 ID logintime aaa 2004-11-11 10:10:10 bbb 2004-11-11 10:10:11 ccc 2004-11-11 10:10:12 aaa 2004-11-11 10:10:13 aaa 2004-11-11 10:10:14 ID logintime aaa 2004-11-10 10:10:10 bbb 2004-11-10 10:10:11 ddd 2004-11-10 10:10:12 aaa 2004-11-10 10:10:13 ID logintime aaa 2004-11-09 10:10:10 bbb 2004-11-09 10:10:11 eee 2004-11-09 10:10:12 これに対して、「5」という結果が取り出したいのです。 (aaa, bbb, ccc, ddd, eeeの5人) 何かいい方法がないでしょうか?? 宜しくお願い致します。
- ベストアンサー
- MySQL
- 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 知識不足のため私には複雑すぎて悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。 また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、 他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、 ご教授いただけると助かります。 説明が分かりづらく表が見づらくて申し訳ございませんが、 宜しくお願い致します。
- ベストアンサー
- SQL Server
- AccessSQL 1つのテーブルに複数のデータ
お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。
- ベストアンサー
- その他(データベース)
- 正規表現で一つ目の区切り文字で区切りたいのですが・・・
aaa/bbb/ccc/ddd aaa/bbb/ccc/ddd/eee aaa/ccc/ddd $a=~/(.*)\/(.*)/; $1はそれぞれ aaa/bbb/ccc aaa/bbb/ccc/ddd aaa/ccc と成ってしまいます。 このように 「最後の/」で分けられてしまいます。 一つ目の/で分けるにはどうしたらよいでしょうか。
- ベストアンサー
- Perl
- select句副問い合わせ 値の個数が多すぎます
SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'
- ベストアンサー
- Oracle
- EXCELで複数行の検索
初心者です。 Aファイルのaaa、bbbなどをキーに Bファイルを検索してできるだけ簡単にマクロ等使わずに 下記のような抽出をする方法があれば教えてください。 よろしくお願いします。 Aファイル aaa bbb ccc Bファイル(例えば「ddd」と「あ」は別セルです) ddd あ eee い aaa う fff え bbb お ggg か ccc き 結果 Aファイル aaa う bbb お ccc き
- ベストアンサー
- オフィス系ソフト
- エクセルのマクロについて教えて下さい。
エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、 A B C D E F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、 A B C D E F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。
- ベストアンサー
- Windows XP
お礼
抽出条件フローの考え方自体間違っていたようですね。 無事、抽出が出来ました。 有難うございました。