求高手帮忙写个SQL

rocky123 2009-11-04 09:00:55
有两个表:人员表T1,登录信息表T2
T1有两个栏位:EMPID(人员ID),EMPNAME(人员姓名)
T2有两个栏位:EMPID(人员ID),LOGTIME(登录时间)
按月份统计人员每天是否登录过系统,查询出来格式如下:
姓名 1,2,3,4……一直到31号(选择的月份有几天就是多少天),最后再加这个人当月的出勤,只要当天登录过就是出勤了!
详细格式请看下面的图片:
http://60.216.13.200/123.jpg
谢谢啊!!!

...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rocky123 2009-11-05
  • 打赏
  • 举报
回复
已解决谢谢!
偷麦 2009-11-05
  • 打赏
  • 举报
回复
select (case when lnk_cnt=0 then '未出勤' else '出勤' end) 是否出勤, logtime 日期,empid 人员编码 from (
select sum(lnk_cnt) lnk_cnt,logtime,empid from (
select count(*) lnk_cnt,to_char(logtime,'yyyy-mm-dd') logtime,empid from
T2 where empid='loginempid' and to_char(logtime,'mm')>='07' and to_char(logtime,'mm')<'08' group by to_char(logtime,'yyyy-mm-dd'),empid
union all(
select 0 lnk_cnt,dt logtime,'loginempid' empid from yearday where to_char(to_date(dt,'yyyy-mm-dd'))<'2009-08-01' and to_char(to_date(dt,'yyyy-mm-dd'))>='2009-07-01'
)
)
group by starttm,empid
order by starttm
Dogfish 2009-11-05
  • 打赏
  • 举报
回复
把统计数据拿出来,然后工作交给asp吧。数据库上的资源能省则省。
cnchart 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnchart 的回复:]
oracle数据库实现

先建个万年历表,用作统计用的,无其它用处
SQL codecreatetable yearday(
"dt"varchar2(20)notnull,constraint index_yearday_dtprimarykey(dt)
);
填充该表数据,使之形成2009-01-01,2009-01-02这样的记录

然后执行sql

SQL codeselect (casewhen lnk_cnt=0then'未出勤'else'出勤'end) 是否出勤, logtime 日期,empid 人员编码from (selectsum(lnk_cnt) lnk_cnt,logtime,empidfrom (selectcount(*) lnk_cnt,to_char(logtime,'yyyy-mm-dd') logtime,empidfrom
T2where empid='loginempid'and to_char(logtime,'mm')>='07'and to_char(logtime,'mm')<'08'groupby to_char(logtime,'yyyy-mm-dd'),empidunionall(select0 lnk_cnt,dt logtime,'loginempid' empidfrom yeardaywhere to_char(to_date(dt,'yyyy-mm-dd'))<'2009-08-01'and to_char(to_date(dt,'yyyy-mm-dd'))>='2009-07-01'
)
)groupby starttm,empidorderby starttm


传入参数:
empid:'loginempid'
月份:'07'
[/Quote]

后面的写错了
group by logtime,empid
order by logtime
cnchart 2009-11-04
  • 打赏
  • 举报
回复
oracle数据库实现

先建个万年历表,用作统计用的,无其它用处

create table yearday(
"dt" varchar2(20) not null,
constraint index_yearday_dt primary key(dt)
);

填充该表数据,使之形成2009-01-01,2009-01-02这样的记录

然后执行sql

select (case when lnk_cnt=0 then '未出勤' else '出勤' end) 是否出勤, logtime 日期,empid 人员编码 from (
select sum(lnk_cnt) lnk_cnt,logtime,empid from (
select count(*) lnk_cnt,to_char(logtime,'yyyy-mm-dd') logtime,empid from
T2 where empid='loginempid' and to_char(logtime,'mm')>='07' and to_char(logtime,'mm')<'08' group by to_char(logtime,'yyyy-mm-dd'),empid
union all(
select 0 lnk_cnt,dt logtime,'loginempid' empid from yearday where to_char(to_date(dt,'yyyy-mm-dd'))<'2009-08-01' and to_char(to_date(dt,'yyyy-mm-dd'))>='2009-07-01'
)
)
group by starttm,empid
order by starttm



传入参数:
empid:'loginempid'
月份:'07'
hwfec 2009-11-04
  • 打赏
  • 举报
回复
当月的出勤数可以在“出”的那段语句里加个记数器。
hwfec 2009-11-04
  • 打赏
  • 举报
回复
给你个大体思路吧。不知是不是你想要的,呵呵
你先查T1表,然后根据ID查T2表的所有记录
用一个循环语句+记数器判断是否出勤。
i 为每月的天数,可以用程序指定。
for 1 to i
if not rs.eof then
if day(rs("LOGTIME")) = i then
response.write"出"
rs.movenext
else
response.write"没出"
end if

else
response.write"没出"
end if

next
个人水平有限,只能想到这儿了

28,406

社区成员

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

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