再开一贴...求一SQL语句.火急.......

heijunma 2005-07-11 06:41:11
有3个表:

yhxx表(用户信息表),有如下字段:

yhid(用户ID),yhxm(姓名),pawword(密码),bumen(所属部门)

zbxx表(值班信息表),有如下字段:

yhid(用户ID),yhxm(姓名),zbnr(值班内容),zbsj(值班时间)

jbxx表(加班信息表),有如下字段:

yhid(用户ID),yhxm(姓名),jbgs(加班个数),jbsj(加班时间)

我想统计yhxx表里所有用户每人在一段时间内的加班总数.每人的加班总数=这段时间内的值班次数+这段时间的加班总数.其中有些用户不值班,有些用户既值班也加班.不值班的用户值班次数输出为0

比如:甲值班也加班,他在2005-1-1值班1次,2005-1-2加班2个.乙不值班,他在2005-1-3加班3个,在2005-1-4加班1个.则在2005-1-1至2005-1-4时间内,统计输出结果如下:

用户ID 用户姓名 值班次数 加班数 总加班数
甲的ID 甲 1 2 3
乙的ID 乙 0 4 4

应该怎么写SQL语句?(数据库是SQL SERVER2000),还有表的字段设置是否需要修改?
望高手帮忙.....


...全文
222 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaa811216 2005-07-12
  • 打赏
  • 举报
回复
恩!你试试吧!别客气!我水平有限我写的只是供你参考,也许还有更简单的方法!再看看别的大侠们的!
heijunma 2005-07-12
  • 打赏
  • 举报
回复
to 李毅大哥
我想统计所有用户的结果,是不是where后面就不用yhxx.yhid=??和yhxm=??这两条语句了?
aaaa811216 2005-07-12
  • 打赏
  • 举报
回复
兄弟,我昨天没有看见你的回复,就上个贴问的问题我回答一下你!
(select yhxx.yhid , yhxx.yhxm , zbxx.zbgs , jbxx.jbgs , jbxx.time
from yhxx
left join zbxx
on yhxx.yhid = zbxx.yhid and yhxx.yhxm = zbxx.yhxm
left join jbxx
on zbxx.yhid = jbxx.yhid and zbxx.yhxm = jbxx.yhxm and zbxx.time = jbxx.time) as table1
这个table1是子查询后,我另命明的表名,当然你也可以自己起。

(select table1.yhid ,yhxm ,Isnull(table1.zbxx, 0) ,Isnull(table1.jbxx,0) ,Isnull((table1.zbxx+table1.jbxx) as count ,0)
from (select yhxx.yhid , yhxx.yhxm , zbxx.zbgs , jbxx.jbgs , jbxx.time
from yhxx
left join zbxx
on yhxx.yhid = zbxx.yhid and yhxx.yhxm = zbxx.yhxm
left join jbxx
on zbxx.yhid = jbxx.yhid and zbxx.yhxm = jbxx.yhxm and zbxx.time = jbxx.time) as table1
where yhxx.yhid = ??
yhxx.yhxm = ??
time between ??) as table
这个table同样也是一个子查询的表名,你也可以另起。

但是你要是换名字的时候,多有的table1,table 都要对应的换!
我知道你要的是统计一段时间所以我才这么写的,我把时间段,用户名的选择都给你留出来了!
就是??的那地方!你自己按照你的想法修改。
还有的就是输出,这个问题你不需要问我吧,我都已经给你写出查询的语句,至于你是利用recordset对象,
或者是别的什么来输出,那你自己考虑吧!
aaaa811216 2005-07-12
  • 打赏
  • 举报
回复
select table.yhid ,table.yhxm ,sum(table.zbxx) ,sum(table.jbxx) ,sum(table.count)
from
(select table1.yhid ,yhxm ,Isnull(table1.zbxx, 0) ,Isnull(table1.jbxx,0) ,Isnull((table1.zbxx+table1.jbxx) as count ,0)
from (select yhxx.yhid , yhxx.yhxm , zbxx.zbgs , jbxx.jbgs , jbxx.time
from yhxx
left join zbxx
on yhxx.yhid = zbxx.yhid and yhxx.yhxm = zbxx.yhxm
left join jbxx
on zbxx.yhid = jbxx.yhid and zbxx.yhxm = jbxx.yhxm and zbxx.time = jbxx.time) as table1
where yhxx.yhid = ??
yhxx.yhxm = ??
time between ??) as table
group by table.yhid ,table.yhxm
where yhxx.yhid = ??
yhxx.yhxm = ??
aaaa811216 2005-07-12
  • 打赏
  • 举报
回复
你的表够构造的有问题,自己在修改一下吧!
crycoming 2005-07-12
  • 打赏
  • 举报
回复
时间段改成自己的

select yhxx.yhid as 用户ID,yhxx.yhxm as 用户姓名,zh.zbs as 值班次数,jb.jbs as 加班数,zh.zbs+jb.jbs as 总加班数 from yhxx
left join (select yhid,count(*) as zbs from zbxx where zbsj>='2005-1-1' and zbsj<='2005-1-31' group by yhid) as zb on yhxx.yhid=zb.yhid
left join (select yhid,count(*) as jbs from jbxx where jbsj>='2005-1-1' and jbsj<='2005-1-31' group by yhid) as jb on yhxx.yhid=jb.yhid
子陌红尘 2005-07-12
  • 打赏
  • 举报
回复
日期条件自己加上即可。
子陌红尘 2005-07-12
  • 打赏
  • 举报
回复
select
用户ID = a.yhid,
用户姓名 = a.yhxm,
值班次数 = SUM(CASE type WHEN 1 THEN 1 ELSE 0 END),
加班数 = SUM(CASE type WHEN 2 THEN jbgs ELSE 0 END),
总加班数 = SUM(CASE type WHEN 1 THEN 1 WHEN 2 THEN jbgs END)
from
yhxx a
left join
(select 1 as type,* from zbxx
union all
select 2 as type,* from jbxx) b
on
a.yhid = b.yhid
group by
a.yhid,a.yhxm
order by
a.yhid
dh20156 2005-07-12
  • 打赏
  • 举报
回复
GageCSDN(稻草人--http://www.sms-web.net)的不行么?
zwrtv 2005-07-12
  • 打赏
  • 举报
回复
路过学习下
heijunma 2005-07-12
  • 打赏
  • 举报
回复
to cncca(来个可乐)
我试了你的代码,运行没错误.但是即值班也加班人员的总加班统计结果不对.比如,帐号是333的用户,值班3次,加班1次.最后统计结果是:值班333次,加班1次,总加班334次.在把记录结果输出的时候还显示3条同样的记录.
itzhiren 2005-07-12
  • 打赏
  • 举报
回复
select yhid,yhxm,count(jbxx.*)as jbcs,count(zbxx.*) as zbcs,count(jbxx.*)+count(zbxx.*) as zbzs from yhxx,jbxx,zbxx where yhxx.yhid=jbxx.yhid and jbxx.yhid=zbxx.yhid group by yhxx.yhid,yhxx.yhxm
cncca 2005-07-12
  • 打赏
  • 举报
回复
从未写过这么复杂的SQL啊,我列出了1月份的统计(自己试了下,太复杂,请楼主有了更好的答案了记得给我一份也好学习一下):
SELECT dbo.yhxx.yhid, dbo.yhxx.yhxm, ISNULL(dbo.zbxx.yhid, 0) AS zbcs,
ISNULL
((SELECT SUM(jbgs)
FROM jbxx
WHERE month(jbsj) = 1 AND yhid = dbo.yhxx.yhid), 0) AS jbcs,
ISNULL(ISNULL(dbo.zbxx.yhid, 0) + ISNULL
((SELECT SUM(jbgs)
FROM jbxx
WHERE month(jbsj) = 1 AND yhid = dbo.yhxx.yhid), 0), 0) AS zjbs
FROM dbo.jbxx INNER JOIN
dbo.zbxx ON dbo.jbxx.yhid = dbo.zbxx.yhid RIGHT OUTER JOIN
dbo.yhxx ON dbo.jbxx.yhid = dbo.yhxx.yhid
zol311 2005-07-12
  • 打赏
  • 举报
回复
前几天买的 100 MB asp 和 asp .net空间50元/年!,
同学们可以做一个简单的个人网站用来找工作
http: // www.hi876.com 你们也看看吧
tigerwen01 2005-07-12
  • 打赏
  • 举报
回复
到SQL SERVER版里请pengdali高手
heijunma 2005-07-12
  • 打赏
  • 举报
回复
to 所有热心大哥

这样写最终是正确的,我是根据leon_jiang(流浪人)和cncca(来个可乐)的代码修改的.或者其它大哥的代码也是正确的.我没有一一验证.

sql=" select yhxx.yhid,yhxx.yhxm,isnull(a.zbs,0) as zbgs,isnull(b.jbs,0) as jbgs,isnull(isnull(a.zbs,0)+isnull(b.jbs,0),0) as zjbs from yhxx yhxx left join (select yhid,count(yhid) as zbs from zbxx where zbrq between '"&time1&"' and '"&time2&"' group by yhid) a on yhxx.yhid=a.yhid left join (select yhid,sum(jbgs) as jbs from jbxx where jbrq between '"&time1&"' and '"&time2&"' group by yhid) b on yhxx.yhid=b.yhid "

其中:
yhxx是用户信息表,zbxx是值班信息表,jbxx是加班信息表
yhxm,yhid,zbgs,jbgs,zjbs分别是用户姓名,用户ID,值班个数,加班个数,总加班数
time1和time2分别是统计的开始日期和结束日期

再次感谢所有给我提供帮助的大哥!!!!
heijunma 2005-07-12
  • 打赏
  • 举报
回复
天啊....终于写出来了....眼泪哗哗的
leon_jiang 2005-07-12
  • 打赏
  • 举报
回复
select yh.yhid,yh.yhxm,nvl(a.zbs,0),nvl(b.jbs,0),(nvl(a.zbs,0)+nvl(b.jbs,0)) total from jbxx yh left join
(select yhid,count(yhid) zbs from zbxx where zbsj between '2005-01-01' and '2005-01-04' group by yhid) a on yh.yhid=a.yhid
left join
(select yhid,sum(jbgs) jbs from jbxx where jbsj between '2005-01-01' and '2005-01-04' group by yhid) b on yh.yhid=b.yhid
看看这个是否行
yonghengdizhen 2005-07-12
  • 打赏
  • 举报
回复
yhxx表(用户信息表),有如下字段:
yhid(用户ID),yhxm(姓名),pawword(密码),bumen(所属部门)
zbxx表(值班信息表),有如下字段:
yhid(用户ID),yhxm(姓名),zbnr(值班内容),zbsj(值班时间)
jbxx表(加班信息表),有如下字段:
yhid(用户ID),yhxm(姓名),jbgs(加班个数),jbsj(加班时间)

select yhid,yhxm,zbcs,jbcs,zbcs+jbcs
from
(select yhid,yhxm,
(select count(yhid) from zbxx where yhid=a.yhid and zbxj>@StartTime and zbsj<=@ToTime) AS zbcs,
(select ISNULL(sum(jbgs),0) from jbxx where yhid=a.yhid and jbxj>@StartTime and jbsj<=@ToTime) AS jbcs
from yhxx a
)

heijunma 2005-07-12
  • 打赏
  • 举报
回复
加班数是jbxx表里jbgs字段的和,某人的总加班数是他的值班个数+他的加班数.(一段时间内)
比如甲在1月1日加了1个班,则在jbxx表里甲的jbgs=1.在1月2日加了2个班,则jbgs=2,从1月1日到1月2日.他的加班数是1+2=3.
加载更多回复(9)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧