SQL求解?????

QQ截图20190421195149.png

我图中的第一个数据表是left join得出来的,由两个表合并的,一个是工作任务表work,字段是ID,日期,员工,工作任务,另一个表是分数表score,字段是ID,日期,员工,打分领导,分数,left join后生成我的第一个数据表。另外还有个员工信息表info,字段为userid,姓名,部门,这个表我没有加在里面,怕三个表太乱了。

最后应该生成表的内容为C领导应该打分而没有打的记录,字段应包括日期,员工姓名,所在部门,工作任务,打分领导,得分。


FineReport nhb2318 发布于 2019-4-21 18:20 (编辑于 2019-4-22 12:11)
1min目标场景问卷 立即参与
回答问题
悬赏:4 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
4
Doctor_WeiLv7中级互助
发布于2019-4-22 08:33(编辑于 2019-4-22 09:41)

首先确认一下,是不是假设只有两个员工,数据表里要存四条记录是吧。我看你现在只列出了2条,确认一下



1)我感觉根本没法固定领导。然后我想了个笨方法

需要你在数据库里插入一列,叫做本应打分领导,然后里面存放的是C,D,你看看有没有办法实现,或者left join 一个临时表。。然后这样的话。你可以直接加两个条件就好了。本应打分领导=c and 领导 is null



2)测验过的方法

--获取领导c的记录(其中包含领导D没有打分的记录,但已经去除了领导C,D同时没有打分的情况)

with old as(

select distinct 日期,员工 from  table

 where 打分领导!=D

--对数据进行去重,old存在这种情况  2018 A C       2018 A  null  将 第二条数据去掉


select  * from old o 

where  o.打分领导 

in 

(

select max(t.打分领导)       from old  t

where t.日期=o.日期 and t.员工=o.员工

)

--现在得到的是领导C的全部的记录(打卡未打卡),然后,你再在里面干啥都行了 

  • nhb2318 nhb2318(提问者) 我的第一个数据库就是left join得出来的呀,由两个表合并的,一个是工作任务表work,字段是ID,日期,员工,工作任务,另一个表是分数表score,字段是ID,日期,员工,打分领导,分数,left join后生成我的第一个数据表。另外还有个员工信息表info,字段为userid,姓名,部门,这个表我没有加在里面,怕三个表太乱了。 最后应该生成表的内容为C领导应该打分而没有打的记录,字段应包括日期,员工姓名,所在部门,工作任务,打分领导,得分。
    2019-04-22 12:10 
  • nhb2318 nhb2318(提问者) 我用了一种方法筛选出来不是我想要的结果。我的做法是join起来,加where 打分领导<>\\\'C\\\'条件后,出现有一种情况不符合要求。 如:同一天,同一个人都被领导打分了,2019.4.20,员工A,C领导打9分,D领导打8分,用我的方法筛选出来后,就是打2019.4.20,A,D,8就条记录筛选出来了,但是领导C实际上是打过分的。 正确的思路是应该把领导C打过分的记录的日期,员工姓名记录下来,然后从join表中删除掉,再生成一个新表才对呀! 怎么做?
    2019-04-22 12:38 
  • Doctor_Wei Doctor_Wei 回复 nhb2318(提问者) 我的方法你试过嘛?我感觉能满足呀
    2019-04-22 13:13 
  • nhb2318 nhb2318(提问者) 回复 Doctor_Wei 不太了解你那个old是什么意思?为什么要用max(t.打分领导) ?我在navicat里运行不行啊,好像不支持with
    2019-04-22 14:22 
  • nhb2318 nhb2318(提问者) 我的实际数据表就是我说的,有三个,还得把部门的那个表加进来,加来加去,我都看不懂了
    2019-04-22 14:24 
最佳回答
0
yuzhimingLv2初级互助
发布于2019-4-22 09:05

没有打分,记录就没有插进去数据库。然后你想找出没有插入数据库得这条记录?

这个考核系统得流程是不是不太对。员工写日报,然后领导根据日报打分。领导得打分动作执行得应该是update语句,而不是insert语句。这样哪个领导没打分,哪个员工没写日报不是很好查询了嘛。

  • nhb2318 nhb2318(提问者) 只要员工写日报,就应该有两位领导打分呀,员工不写的话,那也没办法了
    2019-04-22 11:38 
最佳回答
0
maoningLv5初级互助
发布于2019-4-22 09:08

假设有一个领导表A,一个打分表B
select distinct 日期,员工,工作任务,领导 from(
select B.日期,B.员工,B.工作任务,A.领导
from A,B
union all
select B.日期,B.员工,B.工作任务,B.领导
from B
) XX
最佳回答
0
wukaihuaLv5初级互助
发布于2019-4-22 10:22

with x as (

select '20190410' as 日期,'A' as 员工,'XXX' 任务,'' 打分领导,'' 分数 from dual

union all

select '20190410' as 日期,'B' as 员工,'XXX' 任务,'' 打分领导,'' 分数 from dual

union all

select '20190411' as 日期,'A' as 员工,'XXX' 任务,'C' 打分领导,'8.5' 分数 from dual

union all

select '20190411' as 日期,'B' as 员工,'XXX' 任务,'D' 打分领导,'9.8' 分数 from dual

union all

select '20190412' as 日期,'A' as 员工,'XXX' 任务,'' 打分领导,'' 分数 from dual

union all

select '20190412' as 日期,'B' as 员工,'XXX' 任务,'' 打分领导,'' 分数 from dual

union all

select '20190413' as 日期,'A' as 员工,'XXX' 任务,'C' 打分领导,'9.4' 分数 from dual

union all

select '20190413' as 日期,'B' as 员工,'XXX' 任务,'D' 打分领导,'8.8' 分数 from dual

union all

select '20190414' as 日期,'B' as 员工,'XXX' 任务,'C' 打分领导,'7.9' 分数 from dual

union all

select '20190415' as 日期,'B' as 员工,'XXX' 任务,'C' 打分领导,'9.4' 分数 from dual

union all

select '20190416' as 日期,'A' as 员工,'XXX' 任务,'D' 打分领导,'9.5' 分数 from dual

union all

select '20190417' as 日期,'B' as 员工,'XXX' 任务,'C' 打分领导,'9.2' 分数 from dual

)

,x1 as (--员工

select 'A' as 员工 from dual

union all

select 'B' as 员工 from dual

)

,x2 as (--领导

select 'C' as 打分领导 from dual

union all

select 'D' as 打分领导 from dual

)

,d as (--日期维度

SELECT TO_CHAR(TO_DATE('2019-04-10', 'yyyy-MM-dd') + ROWNUM - 1, 'yyyyMMdd') as 日期

  FROM DUAL

CONNECT BY ROWNUM <=

           trunc(to_date('2019-04-17', 'yyyy-MM-dd') -

                 to_date('2019-04-10', 'yyyy-MM-dd')) + 1

)


--未打分明细 

select a.日期,a.员工,x.打分领导 from (

select * from d,x1,x2

) a left join x on a.日期=x.日期 and a.员工=x.员工 and a.打分领导=x.打分领导

where a.打分领导='C' and x.打分领导 is null

order by a.日期 asc


生成日期,员工,领导维度,去跟打分表匹配,匹配不到的就是没打分的,不过没考虑休息日不上班额情况


  • nhb2318 nhb2318(提问者) 这个方法比较复杂呀,不用考虑休息日,休息日不填报工作任务,员工填什么,领导就打什么,我用了一种方法筛选出来不是我想要的结果。就是join起来,加where 打分领导<>\'C\'条件后,出现有一种情况不符合要求。 如:同一天,同一个人都被领导打分了,2019.4.20,员工A,C领导打9分,D领导打8分,用我的方法筛选出来后,就是打2019.4.20,A,D,8就条记录筛选出来了,但是领导C实际上是打过分的。 正确的思路是应该把领导C打过分的记录的日期,员工姓名记录下来,然后从join表中删除掉,再生成一个新表才对呀!
    2019-04-22 12:26 
最佳回答
0
claire_likeLv2见习互助
发布于2019-4-22 12:24(编辑于 2019-4-22 12:28)

首先需要知道的是哪些任务是需要领导C去打分的,你才能做筛选。不然你只能找出没有被 领导 打分的记录,领导C是否应该打分而没打分你是找不到的。

  • nhb2318 nhb2318(提问者) 只要填报工作任务就需要各个领导打分
    2019-04-22 12:27 
  • 6关注人数
  • 778浏览人数
  • 最后回答于:2019-4-22 12:28
    请选择关闭问题的原因
    确定 取消
    返回顶部