表 A -----(任务表) task_ID task_name
1 任务A
2 任务B
3 任务C
4 任务D
5 任务E
6 任务F
表 B -----(执行任务表)
字段 task_ID task_name task_status transactor
1 任务A 完成 张三
1 任务A 完成 张四
1 任务A 完成 张五
2 任务B 未完成 张三
2 任务B 完成 李四
2 任务B 完成 王五
4 任务D 未完成 王五
5 任务E 完成 赵六
说明一下,执行任务表 中任务,要由多人去执行。
只有全部执行完成,这个任务才算完。 如 任务A如果有一个没执行完成,就不算完。 如 任务B
如果 任务表中有,而执行任务表中,没有。 任务也没有完,如:任务F 要求显示所有任务的完成情况: (所有任务即 A表中有的任务)
task_ID task_name reslut
1 任务A 完成 (A表有数据,B表 任务全部完成)
2 任务B 未完成 (A表有数据,B表 任务未全部完成)
3 任务C 未完成 (A表有数据,B表 无数据)
4 任务D 未完成
5 任务E 完成
6 任务F 未完成请问应该如何写?
1 任务A
2 任务B
3 任务C
4 任务D
5 任务E
6 任务F
表 B -----(执行任务表)
字段 task_ID task_name task_status transactor
1 任务A 完成 张三
1 任务A 完成 张四
1 任务A 完成 张五
2 任务B 未完成 张三
2 任务B 完成 李四
2 任务B 完成 王五
4 任务D 未完成 王五
5 任务E 完成 赵六
说明一下,执行任务表 中任务,要由多人去执行。
只有全部执行完成,这个任务才算完。 如 任务A如果有一个没执行完成,就不算完。 如 任务B
如果 任务表中有,而执行任务表中,没有。 任务也没有完,如:任务F 要求显示所有任务的完成情况: (所有任务即 A表中有的任务)
task_ID task_name reslut
1 任务A 完成 (A表有数据,B表 任务全部完成)
2 任务B 未完成 (A表有数据,B表 任务未全部完成)
3 任务C 未完成 (A表有数据,B表 无数据)
4 任务D 未完成
5 任务E 完成
6 任务F 未完成请问应该如何写?
对执行任务表操作.
根据task_ID来做group by,
having Min(reslut)(或者MAX(reslut),没有中文的数据库做验证,所以,到底是最大,还是最小,需要查一下编码才知道,LZ可以自己测试一下)
= '完成'
这样只是取出所有完成的任务.A和T做左完全连接,NULL的话,就是没有完成的。
SELECT DISTINCT b.task_id, b.task_name FROM b
WHERE b.task_id NOT IN
(SELECT DISTINCT b.task_id FROM b WHERE b.task_status = '0')
UNION
SELECT DISTINCT a.task_id, a.task_name FROM a
WHERE a.task_id NOT IN (SELECT DISTINCT b.task_id FROM b)
(select '1' from tableb b where a.task_id=b.task_id)
union
select task_id,task_name,task_status result from tableb bb where bb.task_status='未完成'
group by task_id,task_name,task_status
union
select task_id,task_name,'完成' from tablea aa where aa.task_id in
(select task_id from tableb
minus
select task_id from tableb where task_status='未完成');
2 select distinct 表B.TASK_ID,表B.TASK_NAME from 表B
3 where 表B.Task_Name not in
4 (select distinct 表B.TASK_name from 表B where 表B.TASK_STATUS='N')
5 );3)SQL> update 表C set reslut='03' where task_id in( --03表示工作未完成,B表无数据
2
2 select distinct 表A.TASK_ID from 表A
3 where 表A.TASK_ID not in(select distinct 表B.TASK_ID from 表B)
4 );--02表示工作未完成,B表未全部完成 这里就不具体写了
update c set result1='完成' where
task_id in (select distinct b.task_id from b where b.task_name not in
(select distinct b.task_name from b where task_status = '未完成'))---全部完成的update c set result1='未完成' where
task_id not in (select distinct b.task_id from b where b.task_name not in
(select distinct b.task_name from b where rtrim(task_status) = '未完成'))--未全部完成的
update c set result1='未完成' where
task_id not in (select distinct b.task_id from b )--一个都没有完成的
a.task_name,
decode(fin_sign,null,'unFinished',fin_sign) as results
from A,
(select yy.*,
decode(sign(unfinishedTask),0,'Finished','unFinished') as fin_sign
from (
select b.task_ID,
b.task_name,
sum(case when b.task_status = '完成'
then 1
else 0
end) as finishedTask,
sum(case when b.task_status = '未完成'
then 1
else 0
end) as unfinishedTask
from B
group by b.task_ID,b.task_name
)yy
)zz
where a.task_ID = zz.task_ID(+)
order by a.task_ID;
==================result======================= TASK_ID TASK_NAME RESULTS
---------- --------- ----------
1 任务A Finished
2 任务B unFinished
3 任务C unFinished
4 任务D unFinished
5 任务E Finished
6 任务F unFinished6 rows selected