![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
AのSQLでヒットし、BのSQLでヒットしないレコードを抽出したいと思います。
イメージとしては、内線(tel)30..のみを使用している社員(employee)を抽出したいと思います。
【AのSQL(内線(tel)30..を使用している社員(employee))】
SELECT `employee` FROM `w_table` WHERE `tel` REGEXP '30..'
【AのSQLの結果】
employee
10001
10001
10002
10002
【BのSQL(内線(tel)30..以外を使用している社員(employee))】
※※※1.ここの書き方が分かりません。※※※
【BのSQLの結果】
employee
10001
10003
【CのSQL(AのSQLを満たし、BのSQLを満たさない社員)】
※※※2.ここの書き方が分かりません。※※※
【CのSQLの結果】
employee
10002
上記の場合、
社員番号10001は内線30..と内線30..以外を使用しています。
社員番号10002は内線30..のみを使用しています。
社員番号10003は内線30..以外を使用しています。
この場合、社員番号10002のみを抽出したいと思います。
その為、【CのSQL】を記述しようと思ったのですが、
どのように SQL 文を記述すればよいか分からなかったので、
記述方法についてアドバイスいただける方がいらっしゃいましたら、
ご教示の程、よろしくお願いします。
なお、【AのSQL】【BのSQL】を書かず、
直接【CのSQL】一回で済む物であれば非常に助かります。
以上、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
センスのない回答ですがとりあえず試しに
SELECT `employee`
,SUM(IF(`tel` REGEXP '30',1,0)) AS OK
,SUM(IF(`tel` REGEXP '30',0,1)) AS NG
FROM `w_table`
GROUP BY `employee`
とすると
OK>0でNG>0なら30もそれ以外もつかっている
OK>0でNG=0なら30だけを使っている
OK=0でNG>0なら30以外しか使っていない
したがって30だけしか使っていないのは
SELECT `employee`
FROM `w_table`
GROUP BY `employee`
HAVING SUM(IF(`tel` REGEXP '30',1,0)) >0
AND SUM(IF(`tel` REGEXP '30',0,1)) =0
みたいな感じ?
ご回答ありがとうございます。
ご教示いただいたSQL文で意図した動作になったと思います。
このたびはどうもありがとうございました。
No.4
- 回答日時:
select distinct employee from w_table a
where not exists
select * from w_table b
where a.employee=b.employee and tel not regexp '30..');
ご回答ありがとうございます。
下記のSQL文で意図した動作になったと思います。
このたびはどうもありがとうございました。
select distinct employee from w_table a
where not exists
(select * from w_table b
where a.employee=b.employee and tel not regexp '30..');
No.3
- 回答日時:
mysqlを触ったことがないので実行可能なSQLかわかりませんが、
SELECT `employee`
FROM `w_table`
GROUP BY employee
HAVING count(distinct tel) = 1
and count(case when `tel` REGEXP '30..' then null else 1 end) = 0;
こんな感じではどうでしょうか?
使用内線の数が一つかつ条件に当てはまらない内線番号の数が0のデータを抽出するイメージです。
的外れだったらすみません。。
ご回答ありがとうございます。
実行可能なSQLである事は確認しました。
ただし、使用内線の数が一つという条件はありませんでした。
以上、よろしくお願いします。
No.1
- 回答日時:
検索されるレコードのカラムを教えてください。
内線番号は1カラムですか?複数カラムあるのですか?つまり社員番号一つに一つの内線番号になっているのですか?それとも複数のカラムに設定されているのですか?
もし、一つのカラムで複数の内線番号を設定いるのなら格納方法を教えてください。
この回答への補足
ご回答ありがとうございます。
テーブルは下記のような感じです。
―――――――――――
|id|employee|tel |
―――――――――――
|1 | 10001 |3001|
|2 | 10001 |3002|
|3 | 10001 |4001|
|4 | 10002 |3001|
|5 | 10002 |3001|
|6 | 10003 |4002|
―――――――――――
その為、内線番号は1カラムで、社員番号一つにつき、一つの内線番号となります。
ただし、社員番号は複数レコードあります。
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Access(アクセス) Access VBAで条件を追加する(書き込む)場所 2 2022/03/23 12:05
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- SQL Server SQL ServerでDBを構築。これは開発? 4 2022/05/28 14:10
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT文で、指定カラム以外の...
-
now()かCURRENT_TIMESTAMPか
-
エクセルかワードで家系図を作...
-
SQLでカラムを追加し、条件に合...
-
AUTO_INCREMENTに0はダメ?
-
カラムをコピーして、新規カラ...
-
一部のカラムでdistinctし全て...
-
MySQLで先頭にカラムを追加
-
SQLで、行ごとのとある要素を比...
-
頭に0が付く文字
-
mysqlでオートナンバーを設定し...
-
ドロップダウンリストの連動し...
-
MySQLで行単位の和算はどうすれ...
-
MYSQLで全てのカラムから検索す...
-
連続番号機能を使ってレコード...
-
GREATESTで NULLをスルーする方...
-
DBエラーの意味
-
UNIONする際、片方テーブルしか...
-
MySQLのオプティマイザはルール...
-
SQLについて教えて下さい。 SEL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一部のカラムでdistinctし全て...
-
SELECT文で、指定カラム以外の...
-
SQLです!!教えてください。
-
GREATESTで NULLをスルーする方...
-
now()かCURRENT_TIMESTAMPか
-
UNIONする際、片方テーブルしか...
-
MYSQLで全てのカラムから検索す...
-
SQLでカラムを追加し、条件に合...
-
MySQLで先頭にカラムを追加
-
sql , insert で空行(全ての列...
-
DBエラーの意味
-
カラムをコピーして、新規カラ...
-
構造が異なる二つのテーブルをu...
-
カラム上の重複を削除するクエ...
-
ROUND関数で、四捨五入ができな...
-
ドロップダウンリストの連動し...
-
AUTO_INCREMENTに0はダメ?
-
MySQLで論理名を取得する方法
-
カラムとコラムの使い分け
-
【SQL】select に ワイルドカー...
おすすめ情報