一条多表操作的SQL语句拦住我了,请大侠进来指点~~~~~~~ 急!!!!(100分)

  • 主题发起人 tommy_linux
  • 开始时间
T

tommy_linux

Unregistered / Unconfirmed
GUEST, unregistred user!
有这么两个表:
zl:
kh xm
001 张三
002 李四
003 王五

sk:
rq kh xm sj kqjg
2002-10-28 002 李四 7:02:00 正常上班
2002-10-28 003 王五 9:08:00 迟到
2002-10-28 001 张三 8:00:00 正常上班
2002-10-29 003 王五 8:05:00 正常上班
2002-10-29 001 张三 8:10:00 正常上班
2002-10-29 002 李四 8:00:00 迟到
2002-10-30 003 王五 8:00:00 正常上班
2002-10-30 001 张三 8:00:00 正常上班
2002-10-30 002 李四 17:59:00 早退
2002-10-31 001 张三 9:21:01 迟到
2002-10-31 003 王五 8:00:00 正常上班
2002-10-31 002 李四 14:00:00 早退

得到如下一张表:
tj:
卡号 姓名 正常上班 迟到 早退
kh xm zcsb cd zt
001 张三 3 1 0
002 李四 2 2 2
003 王五 3 1 0

怎么样用sql语句?
 
select a.kh,a.name,a.zcsb as zcsb,b.zcsb as cd,c.zcsb as zt
from
(select sk.kh as kh,sk.name as name,count(*) as zcsb
where kqjg='正常上班'
)A,
(select sk.kh,sk.name,count(*) as zcsb
where kqjg='迟到'
)b,
(select sk.kh,sk.name,count(*) as zcsb
where kqjg='早退'
)c
group by ....

大体如此。没测试
 
select kh,xm,
sum(case when sk.kqjg='早退' then 1 else 0 end) as 早退,
sum(case when sk.kqjg='迟到' then 1 else 0 end) as 迟到,
sum(case when sk.kqjg='正常上班' then 1 else 0 end) as 正常上班,
sum(case when sk.kqjg='正常下班' then 1 else 0 end) as 正常下班
from sk
where rq between '2002-10-28' and '2002-10-28'
group by sk.kh,sk.xm

这样不行?没有把所以有的加入进去!!!
应该怎么写呀,急!!!
 
你这两张表有点奇怪哦,sk和zl中的zm重复,要采取措施,不让sk中的数据有不一致的情况。
最好还是要遵守三个范式。
试试:
select sk.kh,zl.xm,
sum(case when sk.kqjg='早退' then 1 else 0 end) as 早退,
sum(case when sk.kqjg='迟到' then 1 else 0 end) as 迟到,
sum(case when sk.kqjg='正常上班' then 1 else 0 end) as 正常上班,
sum(case when sk.kqjg='正常下班' then 1 else 0 end) as 正常下班
from sk,zl
where sk.kh=zl.kh and sk.rq between '2002-10-28' and '2002-10-28'
group by sk.kh























 
上面的朋友,您好!
好像只能将SK中的姓名和卡号显示,
如果在ZL表中再加一条记录,而没有刷卡的话,那就不会被统计,
假设加了一个员工,
kh (8888)
xm(tommy)
但他从没有刷过卡,不过也要对他进行统计:
tj:
卡号 姓名 正常上班 迟到 早退
kh xm zcsb cd zt
001 张三 3 1 0
002 李四 2 2 2
003 王五 3 1 0
8888 tommy 0 0 0
 
有多种思路,比如说:写一个触发器,当在tj中加纪录是把纪录添到sk中去。
或者用union联合纪录8888 tommy 0 0 0 :)
 
Select kh,xm,
(Select isnull(count(*),0) from sk where kh=AA.kh and kqjg='正常上班') as zcsb,
(Select isnull(count(*),0) from sk where kh=AA.kh and kqjg='迟到') as cd,
(Select isnull(count(*),0) from sk where kh=AA.kh and kqjg='早退') as zt
From zl AA
 
谢谢你们的参与!!!

QuickSilver的可以解决!!!
 
顶部