• ベストアンサー
  • すぐに回答を!

特定のレコードの抽出方法について

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】一回で済む物であれば非常に助かります。 以上、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • MySQL
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2
  • yambejp
  • ベストアンサー率51% (3827/7415)

センスのない回答ですがとりあえず試しに 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文で意図した動作になったと思います。 このたびはどうもありがとうございました。

その他の回答 (3)

  • 回答No.4
  • moousi
  • ベストアンサー率70% (21/30)

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

  • SQLでの抽出条件

    SQL初心者です。初歩的な質問だと思いますが、ご教授願います。 以下のような2つのテーブルがあります。 【テーブルA】 グループ 社員番号 A 1 A 2 A 3 B 4 B 5 B 6 C 7 C 8 D 9 D 1 【テーブルB】 社員番号 1 9 テーブルBの社員番号と一致する場合、テーブルAをグループ単位で抽出しないようにしたいです。  ・グループAは社員番号1が一致するため抽出しない。  ・グループDは社員番号1と9が一致するため抽出しない。 【取得結果】 グループ 社員番号 B 4 B 5 B 6 C 7 C 8 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

  • 抽出対象の1レコードを複数レコードへ変更し出力する方法を

    抽出対象の1レコードを複数レコードへ変更し出力する方法を SQLで教えてください。(SQLServer2000です。) <イメージ> 店番 顧客番号 年月  A B C D ・・・(Dのあと100項目つづく)・・・ 1000 12345678 200909 10 20 30 40 2000 12345678 200910 30 40 50 60 を 店番 顧客番号 年月  AからD 1000 12345678 200909 10 1000 12345678 200909 20 1000 12345678 200909 30 1000 12345678 200909 40 2000 12345678 200910 30 2000 12345678 200910 40 2000 12345678 200910 50 2000 12345678 200910 60 と出力したいのですが、SQLServer2000ではPIVOT等が使用できず。 抽出処理が思いつきません。 パフォーマンスも悪くなったりしますか。 何か良い方法をご教示ください、よろしくお願い致します。

  • SQL文 特定のレコードを抽出したい

    以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。

  • Accessのレコード抽出

    アクセスのレコード抽出条件で、AとB以外を抽出するためにはどのような条件づけをすればいいのでしょうか? Notを使ってみても、Not"A"ならA以外の抽出可能なのですが、Not"A"Or"B"などAとB以外の抽出設定をしたら、すべてが抽出されてしまう(例:A、B、Cすべてが表示されます) どうすれば、いいでしょうか?

  • ACCESSで抽出したフィールドに同じレコードにある値を複製したい

    A、B、Cという列があって、Aの列の値が空欄(NULL)であるレコードを抽出し、そのレコードのAの列にBの値をコピー(複製)したいのですが・・・・  説明が下手ですみません。もしクリエで不可能な場合、SQLで記述可能でしょうか。その記述文も教えていただけると助かります。よろしくお願いします。

  • 抽出方法

    SQL Server2008を使用しています。 key c1 c2 k ------------ 1 01 01 100 2 01 01 200 3 01 02 120 4 01 02 150 5 01 02 200 上記のようなデータがあるとします。 c1,c2が同じものをまとめて1レコードとして 抽出したいと思っています。 c1,c2が同じものは最大5つまでです。 合計と内訳を下記のようにまとめて 抽出するにはどのようなSQLを記述すればよいでしょうか?    ↓↓↓    c1 c2 k1 k2 k3 k4 k5 k0 --------------------------- 01 01 100 200 0  0 0 300 01 02 120 150 200 0 0 470

  • 同じ値が存在しないレコードの抽出方法について

    下記のテーブルの中で、 b_tableテーブルのidフィールドの値が1つしかない(重複していない)フィールドを抽出したいと思います(この場合ですが、3002と3004を抽出したいです)。 その際、抽出条件を下記の【※※※ここに記述を追加※※※】に記述することで実現したいと思ったのですが、その場合どのようなsql文を書けば良いか分かりませんでした。 その為、このような場合、どのようなsql文を書けば良いかご存知の方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 なお、【※※※ここに記述を追加※※※】に記述を追加したい理由ですが、既存のSQL文にこの条件を追加したいのですが、WHERE以前は別の部分に記述されており、その部分が変更できない為です。 なお、下記のWHERE以前の記述はあくまでサンプルであり、重複していないフィールドを抽出するSQL文と直接関係のない記述でしたら、変更していただいても大丈夫かもしれません(この点曖昧で申し訳ございません。移植元の記述ではテーブルを連結しているように見受けられたため、連結の仕方が多少変わる分には問題ないのかなと思っています。この点については実際にソースをご提示いただければ、それを元に移植させていただいた上で、ご回答差し上げたいと思います)。 ■SQL文 SELECT a.id FROM `a_table` AS a LEFT JOIN `b_table` AS b ON a.id = b.id WHERE 【※※※ここに記述を追加※※※】 ■a_tableテーブル CREATE TABLE IF NOT EXISTS `a_table` ( `auto_id` int(3) NOT NULL, `id` varchar(4) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `a_table` (`auto_id`, `id`) VALUES (101, '3001'), (102, '3002'), (103, '3003'), (104, '3004'); ■b_tableテーブル CREATE TABLE IF NOT EXISTS `b_table` ( `auto_id` int(3) NOT NULL, `id` varchar(4) NOT NULL, `no` varchar(1) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `b_table` (`auto_id`, `id`, `no`) VALUES (101, '3001', '1'), (102, '3001', '2'), (103, '3001', '3'), (104, '3002', '2'), (105, '3003', '1'), (106, '3003', '2'), (107, '3004', '1'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 特定の値が入っているレコードを抽出する方法について

    下記のテーブルがあったとして、 field2にグループAに該当する値と、グループBに該当する値が共に1つずつ入っている field1の値を抽出したいと思いました。 下記の場合ですと、その条件を満たす1, 3, 4, 6を抽出したいと思います。 グループA:1, 2, 3 グループB:101, 102, 103 ――――――――― |field1|field2 ――――――――― |1   |1   |1   |10 |1   |101 |2   |1   |2   |15 |2   |104 |3   |2   |3   |18 |3   |101 |4   |2   |4   |17 |4   |103 |5   |3   |5   |15 |5   |100 |6   |3   |6   |18 |6   |103 ――――――――― 使用バージョンは7.4.19です。 よろしくお願いします。

  • エクセル抽出方法がわかりません

    エクセル抽出方法がわかりません   A   B  1 Aさん 19 2 Aさん 20 3 Bさん 19 4 Cさん 19 5 Cさん 20 6 Dさん 20 7 Eさん 19 抽出結果  A   B  3 Bさん 19 7 Eさん 19 19しかない人を抽出するにはどうしたらよいのでしょうか、、

  • こういうビューを抽出したいのですが...

    こういうビューを抽出するSQLを書きたいのですが、わからず困っています。 TableA (主キー:ID)  ID│CodeA ──┼───── 0001│123 0002│234  :│: TableB (主キー:ID)  ID│CodeA │CodeB │Name ──┼───┼───┼───   1│123  │A1  │XXX   2│123  │B1  │YYY   3│123  │C1  │ZZZ 欲しい抽出結果 (CodeBとNameは1行に最大5回まで存在しうる)  ID│CodeA │CodeB1│Name1 │CodeB2│Name2 │CodeB3│Name3 ──┼───┼───┼───┼───┼───┼───┼─── 0001│123  │A1  │XXX  │B1  │YYY  │C1  │ZZZ こういうのってSELECT文だけで記述できるのでしょうか? どのように記述すれば良いでしょうか?