SQL 查询考勤的有关问题!请 sql2000 数据库
SQL 查询考勤的问题!请高手进 sql2000 数据库
sql2000 数据库
现有
表Ribaobiao2 (日志表) :
Id UserId add_date
1 20 2014-12-01
2 20 2014-12-02
3 21 2014-12-01
4 22 2014-12-02
表Sys_Userinfo (用户表) :
UserId Username
20 张三
21 李四
22 王二
怎么通过用户信息去日志表查询此人的考勤信息得到下面这样一个月报表
姓名 1 2 3 4 5 ---------------------------31到月末最后一天
张三 出勤 出勤 出勤 出勤 出勤
李四 出勤 缺勤 出勤 出勤 出勤
王二 缺勤 缺勤 缺勤 出勤 出勤
------解决思路----------------------
sql2000 数据库
现有
表Ribaobiao2 (日志表) :
Id UserId add_date
1 20 2014-12-01
2 20 2014-12-02
3 21 2014-12-01
4 22 2014-12-02
表Sys_Userinfo (用户表) :
UserId Username
20 张三
21 李四
22 王二
怎么通过用户信息去日志表查询此人的考勤信息得到下面这样一个月报表
姓名 1 2 3 4 5 ---------------------------31到月末最后一天
张三 出勤 出勤 出勤 出勤 出勤
李四 出勤 缺勤 出勤 出勤 出勤
王二 缺勤 缺勤 缺勤 出勤 出勤
------解决思路----------------------
--月份可以加到如下位置,月份我这边假设是日期格式2014-12-01试这个
--不是也可以,再一步转换
DECLARE @MONTH DATETIME
SET @MONTH='2014-12-01'
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT T1.Username,T2.*,'+CAST(DAY(DATEADD(DAY,-1,DATEADD(MONTH,1,@MONTH))) AS VARCHAR(10))+'-[合计出勤天数] [合计缺勤天数] FROM Sys_Userinfo T1 LEFT JOIN(SELECT UserId'
SELECT @SQL=@SQL+',ISNULL(MAX(CASE WHEN DAY(add_date)='+CAST(number AS VARCHAR(2))+' THEN''出勤''END),''缺勤'')['+CAST(number AS VARCHAR(2))+']'
FROM master..spt_values WHERE type='P'AND number>0 AND number<=DAY(DATEADD(DAY,-1,DATEADD(MONTH,1,@MONTH)))--列数随月份变化
SET @SQL=@SQL+',ISNULL(COUNT(DISTINCT add_date),0)[合计出勤天数]'
SET @SQL=@SQL+'FROM Ribaobiao2'
--月份条件在这过滤最好
--查询列不进行计算
+' WHERE add_date>='''+CONVERT(VARCHAR(10),@MONTH,120)+'''AND add_date<'''+CONVERT(VARCHAR(10),DATEADD(MONTH,1,@MONTH),120)
+''' GROUP BY UserId)T2 ON T1.UserId=T2.UserId'
SET @SQL=@SQL+' WHERE T1.UserDept IN(''1014'',''1015'',''1016'',''1017'',''1019'',''1020'')'
--UserDept可以加到上面,T1表的条件都可以加到上面
--都是常量,可以直接用IN
EXEC(@SQL)