首页 > 试题广场 >

在mysql中,有任务中转表task_arrive_tran

[问答题]
在mysql中,有任务中转表task_arrive_transfer(task_no varchar(20) comment "任务号",arrive_time datetime comment "到达中转站时间",transfer_fee int "中转费用" ),任务操作表task_operate(task_no varchar(20) "任务号",start_time datetime "任务开始时间",end_time datetime "任务结束时间", emp_no varchar(20) comment "工号")。历史原因,任务中转表中进入了一些脏数据,若任务的到达中转场时间在每个任务开始前或者任务结束后,则为脏数据;一般来说,任务的执行流程是开始----到达中转站(到达次数>=0)----结束;请计算出在任务开始执行时间是8月份的任务中,每个任务的中转总费用。

select a.task_no, sum(case when a.arrive_time>b.start_time and a.arrive_time<b.end_time then transfer else 0) as money_sum 
from task_arrive_transfer a left join task_operate b  
on a.task_no=b.task_no   
where month(b.start_time)=8 
group by a.task_no
编辑于 2019-08-30 14:18:33 回复(2)
-- 

-- 若任务的到达中转场时间在每个任务开始前或者任务结束后,则为脏数据。

-- 要求:请计算出在任务开始执行时间是8月份的任务中,每个任务的中转总费用。

-- 首先,对数据进行一个清洗:删除脏数据。

-- 条件1:开始执行时间是 8月份
-- 条件2:每个任务的中转总费用

-- 数据拼接
-- 数据清洗
-- (为了方便查询,将结果创建一个视图)
create view task_cor
as
select 
    tko.task_no,tko.start_time,tko.end_time,tko.emp_no,
    tat.arrive_time,tat.transfer_fee
from task_operate as tko
join task_arrive_transfer as tat
on tko.task_no = tat.task_no 
where (tat.arrive_time >= tko.start_time
AND tat.arrive_time <= tko.end_time
)
and substr(tko.start_time,6,2) = '08'
;

-- 查询每个任务的中转总费用

select task_no,sum(transfer_fee)
from task_cor
group by task_no;


-- 如果不创建视图的话,可以将两者进行合并
select t.task_no,sum(t.transfer_fee)
from (
    select 
        tko.task_no,tko.start_time,tko.end_time,tko.emp_no,
        tat.arrive_time,tat.transfer_fee
    from task_operate as tko
    join task_arrive_transfer as tat
    on tko.task_no = tat.task_no 
    where (tat.arrive_time >= tko.start_time
    AND tat.arrive_time <= tko.end_time
    )
    and substr(tko.start_time,6,2) = '08'
)t
group by t.task_no;

图片说明

图片说明

图片说明

发表于 2021-02-27 23:55:28 回复(0)
select a.task_no,
SUM(a.transfer_fee) as money_sum
from task_arrive_transfer a,task_operate b
where a.task_no=b.task_no 
and SUBSTRING(start_time,7,1)=8 
and a.arrive_time between b.start_time and c.end_time 
group by a.task_no 
如有错误,欢迎大家帮忙指教

发表于 2020-08-20 10:23:36 回复(0)
select a.task_no,count(transfer_fee)
from task_operate a 
left join  task_arrive_transfer b
on a.task_no = b.task_no 
where substr(a.start_time = '2018-08') 
and (b.arrive_time < a.end_time and b.arrive_time > a.start_time )
group by a.task_no??
发表于 2019-07-29 20:29:11 回复(1)
    int a[4]={-1,2,1,-4},i,j,k,target=1,b[100][4],n=0;
    for(i=0;i<4;i++)
    {
        for(j=i+1;j<4;j++)
        {
            for(k=j+1;k<4;k++)
            {
                b[n][0]=a[i];
                b[n][1]=a[j];
                b[n][2]=a[k];
                b[n][3]=fabs(a[i]+a[j]+a[k]-target);
                n++;
            }
        }
    }
    j=b[0][3];
    k=0;
    for(i=1;i<n;i++)
        if(b[i][3]<j)
        {
            j=b[i][3];
            k=i;
        }
    printf("%d",b[k][0]+b[k][1]+b[k][2]);
发表于 2020-04-27 11:25:27 回复(0)
select task_no,sum(transfer_fee) as total_fee from (select a.task_no,a.start_time,a.end_time,b.arrive_time,
                                                   b.transfer_fee from task_operate a left join task_transfer b on a.task_no=b.task_no)
    temp where (start_time LIKE "2018-08%") and (arrive_time>start_time and arrive_time<end_time)
    group by task_no;
这是经过测试的,对的,虽然写的不是很简便,刚学,望务嫌弃!

发表于 2019-09-03 12:34:59 回复(0)
select 
    a.task_no, 
    --sum(case when a.arrive_time>b.start_time and a.arrive_time<b.end_time then transfer else 0) as money_sum 
    sum(if a.arrive_time>b.start_time and a.arrive_time<b.end_time,transfer_fee,0) money_sum
from task_arrive_transfer a 
left join task_operate b on a.task_no=b.task_no   
where month(b.start_time)=8 
group by a.task_no
发表于 2019-08-29 18:51:19 回复(0)
select t_o.task_operate,sum(to.transfer_fee) as sum_transfer_fee 
from task_arrive_transfer as t_a
left join task_operate as t_o on
t_a.task_no=t_o.task_no
where t_o.end_time>t_a.arrive_time  and  t_o.start_time<t_a.arrive_time
and month(start_time)=8 and year(start_time)=2018
group by  t_o.task_operate
如有问题欢迎指正
发表于 2019-08-29 18:23:12 回复(0)
select a.task_no,sum(b.transfer_fee)
from task_operate a  left join task_arrive_transfer b 
on a.task_no=b.task_no  and  substr(a.start_time,7,4)=substr(b.arrive_time,7,4)  and substr(a.start_time,7,1)=8
where a.start_time<b.arrive_time  and a.end_time>b.arrive_time
group by a.task_no
发表于 2019-08-29 14:59:51 回复(0)
select t.task_no, sum(t.transfer_fee) from
(select a.*,b.arrive_time, b.transfer_fee
from task_operate a
left join task_arrive_transfer b
on a.task_no =b.task_no ) t
where substr(t.start_time,1,10)>="2018-08-01" and substr(t.start_time,1,10)<="2018-08-31" 
and (t.arrive_time<t.start_time or t.arrive_time>t.end_time)
group by t.task_no
发表于 2019-08-28 22:43:37 回复(0)