我已经为此苦苦挣扎了几个小时。
我有两个表:第一个表具有出勤记录,其中包含行ID,客户ID,服务日期和从0到16的单位数。第二个表中的客户响应具有行ID,客户ID,服务日期和许多其他领域。
这里的问题是:如何查找第二个表上缺少的客户,这些客户在特定日期的第一个表上的单位数超过0?请注意,唯一的唯一字段是行ID。
几个小时后,我想到了这种方法,但是由于某种原因,它返回的日期范围大于20天的结果集为空:
SELECT `caseload`.* FROM `caseload` WHERE `caseload`.`client_id` NOT IN
(
SELECT `caseload`.`client_id` FROM `caseload`
JOIN `form_psr`
ON `caseload`.`client_id` = `form_psr`.`client_id`
AND `caseload`.`date` = `form_psr`.`service_date`
WHERE `caseload`.`date` >= '2019-07-01' AND `caseload`.`date` <= '2019-07-31'
)
HAVING `date` >= '2019-07-01' AND `date` <= '2019-07-31'
AND `units` > 0
此sqlfiddle具有一些示例数据:http://sqlfiddle.com/#!9/0a4be2/49
谢谢!
答案 0 :(得分:2)
您好,您可以使用左联接来确定大小写情况下但不在form_psr中的用户,并使用一个子句来过滤日期和单位数。
select
*
from
caseload as c
left join
form_psr as fp
on c.client_id = fp.client_id
where
fp.client_id is null
and
c.units > 0
and
c.service_date between '2019-07-01' AND '2019-07-31'
答案 1 :(得分:1)
使用not exists
:
select cl.*
from caseload c
where c.units <= 16 and
c.service_date >= '2019-07-01' and
c.service_date < '2019-08-01' and
not exists (select 1
from form_psr as fp
where c.client_id = fp.client_id
);
请注意,我还更改了日期比较。此版本适用于日期和日期/时间值。通常,between
可能具有日期/时间值的意外行为,因此,我建议使用这种明确的构造。
我还假设单位数量永远不会为负。
答案 2 :(得分:0)
使用Gordon的解决方案,我仅需进行几次修改就可以解决我的问题。我接受了他的解决方案,但我只是在发布最终要澄清的内容。这是最终的查询:
select *
from caseload c
where c.units > 0 and
c.service_date >= '2019-07-01' and
c.service_date <= '2019-08-01' and
not exists (select 1
from form_psr as fp
where c.client_id = fp.client_id
and c.service_date = fp.service_date
);