首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

月考勤统计sql 语句

2012-09-18 
月考勤统计sql语句 在线等日期姓名工号类别2012/8/2张三1事假2012/8/4张三1病假2012/8/4李四2公假日期姓名

月考勤统计sql 语句 在线等
日期姓名工号类别
2012/8/2张三1事假
2012/8/4张三1病假
2012/8/4李四2公假

日期 姓名工号工时
2012/8/1 李四 28
2012/8/2 李四 23.2
2012/8/3 李四 22
2012/8/1 张三 18
2012/8/2 张三 15

月考勤的效果

姓名工号1号2号3号4号
张三18事假5病假
李四283.22公假

sql 语句怎样写

[解决办法]
--首先要说 工时表最后一条记录是不是应该是 3号的5小时?
--用SQL2005以后版本写。比较清晰。也不写动态SQL了,麻烦。还不知道会不会结贴...
with t1 as (
select 日期,姓名,工号,类别 as 工时显示,1 as 优先号 from 请假表
union all 
select 日期,姓名,工号,convert(varchar(50),工时),2 as 优先号 from 工时表
),t2 as (
select 日期,姓名,工号,工时显示,row_number()over(partition by 日期,姓名,工号 order by 优先号) rn
from t1 
),t3 as (
select 日期,姓名,工号,工时显示 from t2 where rn=1
)select 姓名,工号
,min(case datepart(dd,日期)=1 then 工时显示 else '' end) as 1号
,min(case datepart(dd,日期)=2 then 工时显示 else '' end) as 2号
,min(case datepart(dd,日期)=3 then 工时显示 else '' end) as 3号
,min(case datepart(dd,日期)=4 then 工时显示 else '' end) as 4号
from t3 group by 姓名,工号
[解决办法]

SQL code
create table t1(日期 date, 姓名  varchar(8),  工号 int, 类别 varchar(8)) insert into t1 select '2012/8/2', '张三', 1, '事假' union allselect '2012/8/4', '张三', 1, '病假' union allselect '2012/8/4', '李四', 2, '公假'create table t2(日期 date, 姓名 varchar(8), 工号 int, 工时 varchar(8)) insert into t2select '2012/8/1', '李四', 2, '8' union allselect '2012/8/2', '李四', 2, '3.2' union allselect '2012/8/3', '李四', 2, '2' union allselect '2012/8/1', '张三', 1, '8' union allselect '2012/8/3', '张三', 1, '5'declare @sql varchar(6000)='select 姓名,工号,'select @sql=@sql+'['+rtrim(t.d)+'] '''+rtrim(t.d)+'号'','from (select distinct datepart(dd,日期) 'd' from t2      union      select distinct datepart(dd,日期) 'd' from t1) tselect @sql=left(@sql,len(@sql)-1)+' from (select 姓名,工号,datepart(dd,日期) ''日期'',类别 ''r'' from t1 union all select 姓名,工号,datepart(dd,日期) ''日期'',工时 ''r'' from t2) apivot(max(r) for 日期 in ('select @sql=@sql+'['+rtrim(t.d)+'],'from (select distinct datepart(dd,日期) 'd' from t2      union      select distinct datepart(dd,日期) 'd' from t1) tselect @sql=left(@sql,len(@sql)-1)+')) p'exec(@sql)/*姓名       工号          1号       2号       3号       4号-------- ----------- -------- -------- -------- --------张三       1           8        事假       5        病假李四       2           8        3.2       2        公假(2 row(s) affected)*/
[解决办法]
这是设计问题,而非三两个SQL语句问题

热点排行