質問: 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 | 上記の例では | 会社コード | 社員番号 | | --- | --- | | AAA | 0002 | | BBB | 0004 | の取得を実現したいです。 次のようなSQLを考えましたが期待する結果が取れません。 ``` select 会社コード,社員番号 from T1 where ((提出日 >= '2019-04-01' and 提出日 < '2020-04-01') or (入力日 >= '2019-04-01' and 入力日 < '2020-04-01')) group by 会社コード,社員番号 having count(*) =0 ``` --- 追記です。 社員番号はAAA社にもBBB社にも同じ番号のレコードが存在し、会社コード+社員番号でユニークです。 以下create table文となります。 ``` CREATE TABLE `T1` ( `会社コード` varchar(3) NOT NULL, `社員番号` varchar(5) NOT NULL, `連番` smallint(2) NOT NULL, `提出日` date DEFAULT NULL, `入力日` date DEFAULT NULL, PRIMARY KEY (`会社コード`,`社員番号`,`連番`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ``` どうぞよろしくお願いいたします。
回答: nakさんの回答が良いと思いますが、あえて別解釈 ``` select 会社コード,社員番号 from T1 group by 会社コード,社員番号 having coalesce(sum( 提出日 between '2019/04/01' and '2020/03/31' or 入力日 between '2019/04/01' and '2020/03/31' ),0)=0 ```