日期:2014-05-17  浏览次数:20757 次

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

日期 姓名 工号 工时
2012/8/1 李四 2 8
2012/8/2 李四 2 3.2
2012/8/3 李四 2 2
2012/8/1 张三 1 8
2012/8/2 张三 1 5

月考勤的效果

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

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 all
select '2012/8/4', '张三', 1, '病假' union all
select '2012/8/4', '李四', 2, '公假'

create table t2
(日期 date, 姓名 varchar(8),
 工号 int, 工时 varchar(8))
 
insert into t2
select '2012/8/1', '李四', 2, '8' union all
select '2012/8/2', '李四', 2, '3.2' union all
select '2012/8/3', '李四', 2, '2' union all
select '2012/8/1', '张三', 1, '8' union all
select '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) t

select @sql=left(@sql,len(@sql)-1)+
' from 
(select 姓名,工号,datepart(dd,日期) ''日期'',类别 ''r'' from t1
 union all
 select 姓名,工号,datepart(dd,日期) ''日期'',工时 ''r'' from t2) a
pivot(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) t

select @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语句问题