質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

992閲覧

グループ内で条件に当てはまらないレコードを持つグループを取得したい

meg278

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/05/09 03:07

編集2019/05/09 04:20

MySQLを使用しています。
以下のテーブルで、
提出日または入力日が指定期間内(2019/04/01~2020/03/31)のデータを持たない
会社コード、社員コードを抽出したいです。

テーブル T1
|会社コード|社員番号|連番|提出日|入力日|
|:--|:--:|--:|
AAA|0001|1|2018-03-20|2018-03-30
AAA|0001|2|2019-04-10|NULL
AAA|0002|1|2019-03-10|NULL
AAA|0003|1|2019-04-10|2019-04-15
BBB|0004|1|2019-03-10|NULL
BBB|0004|2|NULL|2018-03-30

上記の例では

会社コード社員番号
AAA0002
BBB0004

の取得を実現したいです。

次のようなSQLを考えましたが期待する結果が取れません。

SQL

1select 会社コード,社員番号 from T1 2 where 3 ((提出日 >= '2019-04-01' and 提出日 < '2020-04-01') or 4 (入力日 >= '2019-04-01' and 入力日 < '2020-04-01')) 5 group by 会社コード,社員番号 having count(*) =0

追記です。
社員番号はAAA社にもBBB社にも同じ番号のレコードが存在し、会社コード+社員番号でユニークです。
以下create table文となります。

SQL

1CREATE TABLE `T1` ( 2 `会社コード` varchar(3) NOT NULL, 3 `社員番号` varchar(5) NOT NULL, 4 `連番` smallint(2) NOT NULL, 5 `提出日` date DEFAULT NULL, 6 `入力日` date DEFAULT NULL, 7 PRIMARY KEY (`会社コード`,`社員番号`,`連番`) 8) ENGINE=MyISAM DEFAULT CHARSET=utf8;

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/05/09 03:50 編集

・社員番号は全体でユニークなのでしょうか(A社、B社にまたがって) ・それともA社に1番がいてもB社にも1番がいるのでしょうか? 上記条件で処理が違います できれば属性をきちんと配慮したcreate tableで提示していただけると助かります
meg278

2019/05/09 04:20

説明が足りず申し訳ありません。情報を追記いたしました。よろしくお願いいたします。
guest

回答2

0

「存在しない」ものを探す場合、NOT EXISTSを使うと良いと思います(EXISTSが「存在する」で、それの否定形(NOT)なので「存在しない」ものを探します)。

https://www.sejuku.net/blog/73615#NOT_EXISTS

動作は検証していませんが、サンプルコードです。

sql

1SELECT DISTINCT -- 同一の会社コードと社員コードの組み合わせがたくさん出てこないようにDISTINCTします 2 a.会社コード, 3 a.社員コード 4FROM 5 T1 AS a 6WHERE 7 NOT EXISTS ( 8 SELECT 9 * 10 FROM 11 T1 AS b 12 WHERE 13 ( 14 -- aテーブルとbテーブル(実体は同じテーブルですが、a=検索対象テーブル、b=除外対象を示すテーブル)の結合条件。今回は、「除外条件に該当するデータが存在しない」会社コードと社員コードが抽出したいので、会社コードと社員コードを結合条件に指定します。 15 a.会社コード = b.会社コード 16 AND 17 a.社員番号 = b.社員番号 18 ) 19 AND 20 ( 21 -- 除外条件。ここではbテーブルのカラムだけを指定します 22 b.提出日 BETWEEN '2019/04/01' AND '2020/03/31' 23 OR 24 b.入力日 BETWEEN '2019/04/01' AND '2020/03/31' 25 ) 26 )

投稿2019/05/09 03:44

nak

総合スコア696

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg278

2019/05/09 05:09

回答ありがとうございます。期待する結果を得ることができました! 丁寧な解説までいただき助かりました。ありがとうございました。
meg278

2019/05/09 05:15

NOT EXISTS を使った例も非常にわかりやすかったのですが、今回はSQLがよりすっきりしていたyambejp様の回答をベストアンサーにさせていただきたいと思います。お忙しいところ素早い回答をいただき非常に助かりました。ありがとうございました。
guest

0

ベストアンサー

nakさんの回答が良いと思いますが、あえて別解釈

SQL

1select 会社コード,社員番号 from T1 2group by 会社コード,社員番号 3having coalesce(sum( 4提出日 between '2019/04/01' and '2020/03/31' 5or 入力日 between '2019/04/01' and '2020/03/31' 6),0)=0

投稿2019/05/09 04:26

yambejp

総合スコア114583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg278

2019/05/09 05:00 編集

回答いただきありがとうございます。having句の coalesce(sum( 提出日 between '2019/04/01' and '2020/03/31' or 入力日 between '2019/04/01' and '2020/03/31' ),0)=0 の部分が理解ができないのですが、 「提出日が期間内、または入力日が期間内のデータ件数が0件」 ということでしょうか?いまいち腑に落ちていないので解説をお願いできますでしょうか。 追記:結果は期待する結果が取得できました!自分の理解が追いついておらずすみません。。
yambejp

2019/05/09 05:02 編集

sumを取ると0件の場合とnullの場合が混在することがあります nullだったときに0と読み替えるのがcoalcaseです SQLにおいてnullは非常に特殊な挙動をとりますので、 今回に限らず取扱に注意ください たとえばnullは指定させず、過去日(1970-01-01)や未来日(2099-12-31)などを 指定するなどの方が管理は楽になる場合があります
meg278

2019/05/09 05:16

coalcaseの使い方を初めて知りました。勉強になりました。ありがとうございます。nullについても今後注意していきたいと思います。お忙しいところ回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問