
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同一日に複数レコードがある場...
-
テーブル名が可変の場合のクエ...
-
データベースのバージョン、ホスト
-
mysqlがインストールされている...
-
MySQL NULLだけをカウントして...
-
東京23区を、皇居を中心とした...
-
#1062 - '0' は索引 'PRIMARY' ...
-
データベースの接続に失敗して...
-
エラー 1068 (42000): 複数の主...
-
無料なのに支払するのか!です...
-
MAMP 99ドル約1.6万円 高い...
-
あってますか?SQL
-
WHERE `年月日` = '晴' OR `年...
-
SQLです教えてくださいお願いし...
-
SQLを作ったのですがうまくいき...
-
(初心者)MySQLやmaraDBで、crea...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SQLです教えてください。
-
SQLです教えてくださいお願いし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文で、指定カラム以外の...
-
一部のカラムでdistinctし全て...
-
UNIONする際、片方テーブルしか...
-
MYSQLで全てのカラムから検索す...
-
AUTO_INCREMENTに0はダメ?
-
GREATESTで NULLをスルーする方...
-
now()かCURRENT_TIMESTAMPか
-
sql , insert で空行(全ての列...
-
SQLでカラムを追加し、条件に合...
-
【SQL】select に ワイルドカー...
-
MySQLで先頭にカラムを追加
-
カラムをコピーして、新規カラ...
-
ROUND関数で、四捨五入ができな...
-
カラムとコラムの使い分け
-
カラム上の重複を削除するクエ...
-
頭に0が付く文字
-
ドロップダウンリストの連動し...
-
エクセルかワードで家系図を作...
-
update時にtimestampが更新され...
-
日付を一括UPDATE
おすすめ情報