月考勤统计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 姓名,工号
[解决办法]
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语句问题