SQL Server 中的子查询出现错误

问题描述 投票:0回答:1

找出医院内共有多少人?

create table hospital (
    emp_id int
    , action varchar(10)
    , time datetime
);

insert into hospital values ('1', 'in', '2019-12-22 09:00:00');
insert into hospital values ('1', 'out', '2019-12-22 09:15:00');
insert into hospital values ('2', 'in', '2019-12-22 09:00:00');
insert into hospital values ('2', 'out', '2019-12-22 09:15:00');
insert into hospital values ('2', 'in', '2019-12-22 09:30:00');
insert into hospital values ('3', 'out', '2019-12-22 09:00:00');
insert into hospital values ('3', 'in', '2019-12-22 09:15:00');
insert into hospital values ('3', 'out', '2019-12-22 09:30:00');
insert into hospital values ('3', 'in', '2019-12-22 09:45:00');
insert into hospital values ('4', 'in', '2019-12-22 09:45:00');
insert into hospital values ('5', 'out', '2019-12-22 09:40:00');

我的解决方案

select emp_id, max(time) as total_in
from hospital
where action = 'in'
group by emp_id
having max(time) > ANY (
    select emp_id, max(time)
    from hospital
    where action = 'Out'
    group by emp_id
);

请向我解释为什么会出现此错误

当子查询不带 EXISTS 引入时,选择列表中只能指定一个表达式。

在 SQL Server 中运行上述查询时,即使我使用 ANY 多行运算符和子查询。

答案应为 emp_id 2,3,4。

sql sql-server subquery
1个回答
0
投票

看起来您需要将每个员工的最新(最大)“入”时间与最近(最大)“出”时间进行比较。我希望您还需要处理给定员工有“输入”行但没有“输出”行的情况。

有几种方法可以做到这一点。

一种是建立两个子选择,一个用于“in”,一个用于“out”,在

emp_id
上将它们连接起来,并比较时间。

select I.emp_id, I.latest_in
from (
    select emp_id, max(time) as latest_in
    from hospital
    where action = 'In'
    group by emp_id
) I
left join (
    select emp_id, max(time) as latest_out
    from hospital
    where action = 'Out'
    group by emp_id
) O ON O.emp_id = I.emp_id
where (I.latest_in > O.latest_out or O.latest_out is null);

另一种方法是使用条件聚合来计算同一子查询中的最新入和最新出。 条件聚合 只是在聚合函数中放置一个条件

IIF()
函数或
CASE
表达式 - 在本例中为
MAX()
。如果条件返回一个值,则该值包含在聚合中。如果不存在,则显式或隐式 NULL 将被忽略。

select IO.emp_id, IO.latest_in
from (
    select
        emp_id,
        max(case when action = 'In' then time end) as latest_in,
        max(case when action = 'Out' then time end) as latest_out
    from hospital
    group by emp_id
) IO
where (IO.latest_in > IO.latest_out or IO.latest_out is null);
© www.soinside.com 2019 - 2024. All rights reserved.