22,209
社区成员
发帖
与我相关
我的任务
分享
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[addtime] Datetime,[perid] int,[signtime] Datetime)
Insert #T
select 1,'2016-04-20 08:57:17.880',2,'2016-04-20 08:57:44.263' union all
select 3,'2016-04-20 08:58:38.930',7,'2016-04-20 08:58:41.447' union all
select 4,'2016-04-20 08:58:42.693',22,'2016-04-20 08:59:11.323' union all
select 6,'2016-04-20 08:59:42.150',107,'2016-04-20 08:59:48.460' union all
select 9,'2016-04-20 09:00:25.043',1,'2016-04-20 09:00:39.357' union all
select 10,'2016-04-20 09:00:30.393',99,'2016-04-20 09:00:33.190' union all
select 64,'2016-04-20 09:57:10.980',1,'2016-04-20 09:57:21.630' union all
select 68,'2016-04-20 09:59:44.427',105,'2016-04-20 10:01:24.300' union all
select 354,'2016-04-20 18:15:07.743',2,'2016-04-20 18:16:10.397' union all
select 355,'2016-04-20 18:16:02.583',99,'2016-04-20 18:16:06.193' union all
select 356,'2016-04-20 18:16:37.543',7,'2016-04-20 18:16:40.897' union all
select 357,'2016-04-20 18:17:02.787',105,'2016-04-20 18:18:06.920' union all
select 358,'2016-04-20 18:17:08.937',107,'2016-04-20 18:18:08.790' union all
select 360,'2016-04-20 18:17:22.233',22,'2016-04-20 18:17:24.850' union all
select 388,'2016-04-20 19:21:17.770',34,'2016-04-20 19:21:33.587' union all
select 456,'2016-04-21 08:53:12.970',2,'2016-04-21 08:53:54.237' union all
select 458,'2016-04-21 08:56:52.740',107,'2016-04-21 08:56:57.783' union all
select 460,'2016-04-21 08:58:39.583',7,'2016-04-21 08:58:44.730' union all
select 462,'2016-04-21 08:59:06.070',99,'2016-04-21 08:59:08.453' union all
select 463,'2016-04-21 08:59:29.480',22,'2016-04-21 08:59:31.050' union all
select 480,'2016-04-21 09:34:30.993',105,'2016-04-21 09:34:34.537' union all
select 490,'2016-04-21 09:42:46.550',111,'2016-04-21 09:42:54.817' union all
select 491,'2016-04-21 09:43:16.053',112,'2016-04-21 09:43:19.010' union all
select 514,'2016-04-21 09:56:33.540',105,'2016-04-21 09:57:09.187' union all
select 517,'2016-04-21 09:57:24.080',105,'2016-04-21 09:57:26.227' union all
select 521,'2016-04-21 10:03:13.820',105,'2016-04-21 10:03:16.523' union all
select 571,'2016-04-21 11:39:04.620',1,'2016-04-21 11:39:37.060' union all
select 670,'2016-04-21 15:53:55.020',34,'2016-04-21 15:54:06.280' union all
select 723,'2016-04-21 19:14:08.137',2,'2016-04-21 19:14:17.187' union all
select 724,'2016-04-21 19:14:32.587',107,'2016-04-21 19:14:42.650' union all
select 725,'2016-04-21 19:14:38.420',7,'2016-04-21 19:14:41.157' union all
select 726,'2016-04-21 19:15:08.170',105,'2016-04-21 19:15:10.827' union all
select 728,'2016-04-21 19:15:34.587',99,'2016-04-21 19:15:37.133' union all
select 778,'2016-04-22 08:12:48.170',112,'2016-04-22 08:13:03.770' union all
select 813,'2016-04-22 08:57:30.573',2,'2016-04-22 08:57:55.283' union all
select 816,'2016-04-22 09:01:31.570',22,'2016-04-22 09:01:40.193' union all
select 817,'2016-04-22 09:01:39.253',7,'2016-04-22 09:02:07.550' union all
select 829,'2016-04-22 09:09:14.570',105,'2016-04-22 09:10:13.327' union all
select 836,'2016-04-22 09:18:39.307',99,'2016-04-22 09:18:43.273' union all
select 1239,'2016-04-22 17:02:29.543',7,'2016-04-22 17:02:32.590' union all
select 1304,'2016-04-22 19:01:30.980',112,'2016-04-22 19:01:40.497' union all
select 1311,'2016-04-22 19:08:01.357',105,'2016-04-22 19:08:05.527' union all
select 1312,'2016-04-22 19:08:42.620',105,'2016-04-22 19:08:47.760' union all
select 1314,'2016-04-22 19:09:40.507',7,'2016-04-22 19:09:44.367' union all
select 1315,'2016-04-22 19:10:45.520',99,'2016-04-22 19:10:50.000' union all
select 1317,'2016-04-22 19:11:21.040',22,'2016-04-22 19:11:26.097' union all
select 1324,'2016-04-22 19:20:05.173',2,'2016-04-22 19:20:32.737' union all
select 1811,'2016-04-24 14:09:07.737',107,'2016-04-24 14:09:15.130' union all
select 1824,'2016-04-24 14:23:03.697',7,'2016-04-24 14:23:39.540' union all
select 1826,'2016-04-24 14:23:26.257',2,'2016-04-24 14:23:33.120' union all
select 1829,'2016-04-24 14:26:30.553',22,'2016-04-24 14:26:41.117' union all
select 1832,'2016-04-24 14:28:10.387',99,'2016-04-24 14:28:12.457' union all
select 1840,'2016-04-24 14:33:14.160',112,'2016-04-24 14:33:25.513' union all
select 1845,'2016-04-24 14:35:38.290',112,'2016-04-24 14:35:42.120' union all
select 1849,'2016-04-24 14:36:53.400',105,'2016-04-24 14:37:01.133' union all
select 2010,'2016-04-24 16:59:54.453',7,'2016-04-24 17:00:19.370' union all
select 2011,'2016-04-24 17:01:03.860',2,'2016-04-24 17:01:14.830' union all
select 2012,'2016-04-24 17:06:04.140',22,'2016-04-24 17:06:25.920' union all
select 2013,'2016-04-24 17:06:30.770',99,'2016-04-24 17:06:35.157' union all
select 2018,'2016-04-24 17:09:19.590',99,'2016-04-24 17:09:26.903' union all
select 2024,'2016-04-24 17:14:19.757',112,'2016-04-24 17:14:23.527' union all
select 2027,'2016-04-24 17:20:55.700',107,'2016-04-24 17:21:00.160' union all
select 2048,'2016-04-24 17:51:01.910',105,'2016-04-24 17:51:44.887' union all
select 2128,'2016-04-25 08:54:52.230',112,'2016-04-25 08:55:45.013' union all
select 2129,'2016-04-25 08:55:55.903',2,'2016-04-25 08:56:13.177' union all
select 2131,'2016-04-25 08:56:43.410',7,'2016-04-25 08:56:48.930' union all
select 2132,'2016-04-25 08:56:54.260',22,'2016-04-25 08:56:55.947' union all
select 2133,'2016-04-25 08:57:04.767',22,'2016-04-25 08:57:13.647' union all
select 2138,'2016-04-25 08:58:48.437',99,'2016-04-25 08:59:58.480' union all
select 2140,'2016-04-25 08:59:58.580',105,'2016-04-25 09:00:19.157' union all
select 2142,'2016-04-25 09:00:33.620',99,'2016-04-25 09:00:40.550' union all
select 2172,'2016-04-25 09:15:52.783',107,'2016-04-25 09:16:52.790' union all
select 2212,'2016-04-25 09:33:26.413',70,'2016-04-25 09:34:36.667' union all
select 2907,'2016-04-25 18:53:35.943',7,'2016-04-25 18:54:02.210' union all
select 2908,'2016-04-25 18:53:43.920',105,'2016-04-25 18:54:08.087' union all
select 2909,'2016-04-25 18:53:45.137',107,'2016-04-25 18:54:16.847' union all
select 2910,'2016-04-25 18:54:05.267',112,'2016-04-25 18:54:12.090' union all
select 2911,'2016-04-25 18:54:29.120',128,'2016-04-25 18:55:53.053' union all
select 2912,'2016-04-25 18:54:36.293',99,'2016-04-25 18:54:39.620' union all
select 2920,'2016-04-25 18:58:47.703',2,'2016-04-25 18:59:18.027' union all
select 2979,'2016-04-26 08:55:55.280',105,'2016-04-26 08:56:31.597' union all
select 2980,'2016-04-26 08:55:57.617',2,'2016-04-26 08:56:05.287' union all
select 2981,'2016-04-26 08:56:26.690',22,'2016-04-26 08:56:32.857' union all
select 2982,'2016-04-26 08:56:37.260',7,'2016-04-26 08:56:40.077' union all
select 2983,'2016-04-26 08:57:06.440',99,'2016-04-26 08:57:08.620' union all
select 2985,'2016-04-26 08:57:14.323',128,'2016-04-26 08:57:25.350' union all
select 2991,'2016-04-26 09:02:41.207',1,'2016-04-26 09:03:00.243' union all
select 2993,'2016-04-26 09:04:08.927',112,'2016-04-26 09:04:16.037' union all
select 3061,'2016-04-26 13:53:55.430',99,'2016-04-26 13:54:42.450' union all
select 3295,'2016-04-26 19:12:12.040',112,'2016-04-26 19:12:19.023' union all
select 3299,'2016-04-26 19:14:09.003',105,'2016-04-26 19:14:56.330' union all
select 3305,'2016-04-26 19:15:44.793',128,'2016-04-26 19:15:48.253' union all
select 3308,'2016-04-26 19:17:56.480',2,'2016-04-26 19:18:17.387' union all
select 3309,'2016-04-26 19:18:02.833',7,'2016-04-26 19:18:06.280' union all
select 3310,'2016-04-26 19:18:48.040',99,'2016-04-26 19:18:51.730' union all
select 3330,'2016-04-26 19:28:03.630',7,'2016-04-26 19:28:30.093' union all
select 3344,'2016-04-26 19:40:34.237',22,'2016-04-26 19:40:40.253' union all
select 3396,'2016-04-27 08:37:53.213',112,'2016-04-27 08:39:04.630' union all
select 3403,'2016-04-27 08:46:36.530',105,'2016-04-27 08:47:15.960' union all
select 3408,'2016-04-27 08:53:44.273',2,'2016-04-27 08:53:53.480'
Go
declare @date date = '2016-04-29'
declare @PivotedColumn varchar(max) = ''
select @PivotedColumn += '[' + datename(day, addtime) + '],'
from #T
where month(addtime) = month(@date) and year(addtime) = year(@date)
group by datename(day, addtime)
order by datename(day, addtime)
if len(@PivotedColumn) = 0
print 'no data'
else begin
declare @ExecCommand varchar(max) = '
with NewTable as (
select [Unique].perid, [Unique].day, [State].state
from
(
select perid, min(addtime) as addtime, day(addtime) as day
from #T
where month(addtime) = ' + datename(month, @date) + 'and year(addtime) = ' + datename(year, @date) +'
group by perid, day(addtime)
) as [Unique]
left join
(
select top 100 percent addtime, case when convert(time, addtime) <= ''9:00'' then ''正常''
when convert(time, addtime) between ''9:00'' and ''18:00'' then ''迟到''
when convert(time, addtime) >= ''18:00'' then ''缺打''
end as state
from #T
where month(addtime) = ' + datename(month, @date) + 'and year(addtime) = ' + datename(year, @date) +'
order by addtime
) as [State]
on [Unique].addtime = [State].addtime
)
select t.perid,' + @PivotedColumn + '
[正常] as [出勤天数],
[迟到] as [迟到天数],
[缺打] as [缺打天数],
' + cast(datediff(day, @date, dateadd(month, 1, @date)) as char(2)) + '- [正常] - [迟到] - [缺打] as [未打卡天数]
from
NewTable pivot(min(state) for [day] in(' + substring(@PivotedColumn, 1, len(@PivotedColumn)-1) + ')) t
inner join
NewTable pivot(count(day) for [State] in([正常], [迟到], [缺打])) tt
on t.perid = tt.perid
'
exec(@ExecCommand)
end
drop table #T
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[addtime] Datetime,[perid] int,[signtime] Datetime)
Insert #T
select 1,'2016-04-20 08:57:17.880',2,'2016-04-20 08:57:44.263' union all
select 3,'2016-04-20 08:58:38.930',7,'2016-04-20 08:58:41.447' union all
select 4,'2016-04-20 08:58:42.693',22,'2016-04-20 08:59:11.323' union all
select 6,'2016-04-20 08:59:42.150',107,'2016-04-20 08:59:48.460' union all
select 9,'2016-04-20 09:00:25.043',1,'2016-04-20 09:00:39.357' union all
select 10,'2016-04-20 09:00:30.393',99,'2016-04-20 09:00:33.190' union all
select 64,'2016-04-20 09:57:10.980',1,'2016-04-20 09:57:21.630' union all
select 68,'2016-04-20 09:59:44.427',105,'2016-04-20 10:01:24.300' union all
select 354,'2016-04-20 18:15:07.743',2,'2016-04-20 18:16:10.397' union all
select 355,'2016-04-20 18:16:02.583',99,'2016-04-20 18:16:06.193' union all
select 356,'2016-04-20 18:16:37.543',7,'2016-04-20 18:16:40.897' union all
select 357,'2016-04-20 18:17:02.787',105,'2016-04-20 18:18:06.920' union all
select 358,'2016-04-20 18:17:08.937',107,'2016-04-20 18:18:08.790' union all
select 360,'2016-04-20 18:17:22.233',22,'2016-04-20 18:17:24.850' union all
select 388,'2016-04-20 19:21:17.770',34,'2016-04-20 19:21:33.587' union all
select 456,'2016-04-21 08:53:12.970',2,'2016-04-21 08:53:54.237' union all
select 458,'2016-04-21 08:56:52.740',107,'2016-04-21 08:56:57.783' union all
select 460,'2016-04-21 08:58:39.583',7,'2016-04-21 08:58:44.730' union all
select 462,'2016-04-21 08:59:06.070',99,'2016-04-21 08:59:08.453' union all
select 463,'2016-04-21 08:59:29.480',22,'2016-04-21 08:59:31.050' union all
select 480,'2016-04-21 09:34:30.993',105,'2016-04-21 09:34:34.537' union all
select 490,'2016-04-21 09:42:46.550',111,'2016-04-21 09:42:54.817' union all
select 491,'2016-04-21 09:43:16.053',112,'2016-04-21 09:43:19.010' union all
select 514,'2016-04-21 09:56:33.540',105,'2016-04-21 09:57:09.187' union all
select 517,'2016-04-21 09:57:24.080',105,'2016-04-21 09:57:26.227' union all
select 521,'2016-04-21 10:03:13.820',105,'2016-04-21 10:03:16.523' union all
select 571,'2016-04-21 11:39:04.620',1,'2016-04-21 11:39:37.060' union all
select 670,'2016-04-21 15:53:55.020',34,'2016-04-21 15:54:06.280' union all
select 723,'2016-04-21 19:14:08.137',2,'2016-04-21 19:14:17.187' union all
select 724,'2016-04-21 19:14:32.587',107,'2016-04-21 19:14:42.650' union all
select 725,'2016-04-21 19:14:38.420',7,'2016-04-21 19:14:41.157' union all
select 726,'2016-04-21 19:15:08.170',105,'2016-04-21 19:15:10.827' union all
select 728,'2016-04-21 19:15:34.587',99,'2016-04-21 19:15:37.133' union all
select 778,'2016-04-22 08:12:48.170',112,'2016-04-22 08:13:03.770' union all
select 813,'2016-04-22 08:57:30.573',2,'2016-04-22 08:57:55.283' union all
select 816,'2016-04-22 09:01:31.570',22,'2016-04-22 09:01:40.193' union all
select 817,'2016-04-22 09:01:39.253',7,'2016-04-22 09:02:07.550' union all
select 829,'2016-04-22 09:09:14.570',105,'2016-04-22 09:10:13.327' union all
select 836,'2016-04-22 09:18:39.307',99,'2016-04-22 09:18:43.273' union all
select 1239,'2016-04-22 17:02:29.543',7,'2016-04-22 17:02:32.590' union all
select 1304,'2016-04-22 19:01:30.980',112,'2016-04-22 19:01:40.497' union all
select 1311,'2016-04-22 19:08:01.357',105,'2016-04-22 19:08:05.527' union all
select 1312,'2016-04-22 19:08:42.620',105,'2016-04-22 19:08:47.760' union all
select 1314,'2016-04-22 19:09:40.507',7,'2016-04-22 19:09:44.367' union all
select 1315,'2016-04-22 19:10:45.520',99,'2016-04-22 19:10:50.000' union all
select 1317,'2016-04-22 19:11:21.040',22,'2016-04-22 19:11:26.097' union all
select 1324,'2016-04-22 19:20:05.173',2,'2016-04-22 19:20:32.737' union all
select 1811,'2016-04-24 14:09:07.737',107,'2016-04-24 14:09:15.130' union all
select 1824,'2016-04-24 14:23:03.697',7,'2016-04-24 14:23:39.540' union all
select 1826,'2016-04-24 14:23:26.257',2,'2016-04-24 14:23:33.120' union all
select 1829,'2016-04-24 14:26:30.553',22,'2016-04-24 14:26:41.117' union all
select 1832,'2016-04-24 14:28:10.387',99,'2016-04-24 14:28:12.457' union all
select 1840,'2016-04-24 14:33:14.160',112,'2016-04-24 14:33:25.513' union all
select 1845,'2016-04-24 14:35:38.290',112,'2016-04-24 14:35:42.120' union all
select 1849,'2016-04-24 14:36:53.400',105,'2016-04-24 14:37:01.133' union all
select 2010,'2016-04-24 16:59:54.453',7,'2016-04-24 17:00:19.370' union all
select 2011,'2016-04-24 17:01:03.860',2,'2016-04-24 17:01:14.830' union all
select 2012,'2016-04-24 17:06:04.140',22,'2016-04-24 17:06:25.920' union all
select 2013,'2016-04-24 17:06:30.770',99,'2016-04-24 17:06:35.157' union all
select 2018,'2016-04-24 17:09:19.590',99,'2016-04-24 17:09:26.903' union all
select 2024,'2016-04-24 17:14:19.757',112,'2016-04-24 17:14:23.527' union all
select 2027,'2016-04-24 17:20:55.700',107,'2016-04-24 17:21:00.160' union all
select 2048,'2016-04-24 17:51:01.910',105,'2016-04-24 17:51:44.887' union all
select 2128,'2016-04-25 08:54:52.230',112,'2016-04-25 08:55:45.013' union all
select 2129,'2016-04-25 08:55:55.903',2,'2016-04-25 08:56:13.177' union all
select 2131,'2016-04-25 08:56:43.410',7,'2016-04-25 08:56:48.930' union all
select 2132,'2016-04-25 08:56:54.260',22,'2016-04-25 08:56:55.947' union all
select 2133,'2016-04-25 08:57:04.767',22,'2016-04-25 08:57:13.647' union all
select 2138,'2016-04-25 08:58:48.437',99,'2016-04-25 08:59:58.480' union all
select 2140,'2016-04-25 08:59:58.580',105,'2016-04-25 09:00:19.157' union all
select 2142,'2016-04-25 09:00:33.620',99,'2016-04-25 09:00:40.550' union all
select 2172,'2016-04-25 09:15:52.783',107,'2016-04-25 09:16:52.790' union all
select 2212,'2016-04-25 09:33:26.413',70,'2016-04-25 09:34:36.667' union all
select 2907,'2016-04-25 18:53:35.943',7,'2016-04-25 18:54:02.210' union all
select 2908,'2016-04-25 18:53:43.920',105,'2016-04-25 18:54:08.087' union all
select 2909,'2016-04-25 18:53:45.137',107,'2016-04-25 18:54:16.847' union all
select 2910,'2016-04-25 18:54:05.267',112,'2016-04-25 18:54:12.090' union all
select 2911,'2016-04-25 18:54:29.120',128,'2016-04-25 18:55:53.053' union all
select 2912,'2016-04-25 18:54:36.293',99,'2016-04-25 18:54:39.620' union all
select 2920,'2016-04-25 18:58:47.703',2,'2016-04-25 18:59:18.027' union all
select 2979,'2016-04-26 08:55:55.280',105,'2016-04-26 08:56:31.597' union all
select 2980,'2016-04-26 08:55:57.617',2,'2016-04-26 08:56:05.287' union all
select 2981,'2016-04-26 08:56:26.690',22,'2016-04-26 08:56:32.857' union all
select 2982,'2016-04-26 08:56:37.260',7,'2016-04-26 08:56:40.077' union all
select 2983,'2016-04-26 08:57:06.440',99,'2016-04-26 08:57:08.620' union all
select 2985,'2016-04-26 08:57:14.323',128,'2016-04-26 08:57:25.350' union all
select 2991,'2016-04-26 09:02:41.207',1,'2016-04-26 09:03:00.243' union all
select 2993,'2016-04-26 09:04:08.927',112,'2016-04-26 09:04:16.037' union all
select 3061,'2016-04-26 13:53:55.430',99,'2016-04-26 13:54:42.450' union all
select 3295,'2016-04-26 19:12:12.040',112,'2016-04-26 19:12:19.023' union all
select 3299,'2016-04-26 19:14:09.003',105,'2016-04-26 19:14:56.330' union all
select 3305,'2016-04-26 19:15:44.793',128,'2016-04-26 19:15:48.253' union all
select 3308,'2016-04-26 19:17:56.480',2,'2016-04-26 19:18:17.387' union all
select 3309,'2016-04-26 19:18:02.833',7,'2016-04-26 19:18:06.280' union all
select 3310,'2016-04-26 19:18:48.040',99,'2016-04-26 19:18:51.730' union all
select 3330,'2016-04-26 19:28:03.630',7,'2016-04-26 19:28:30.093' union all
select 3344,'2016-04-26 19:40:34.237',22,'2016-04-26 19:40:40.253' union all
select 3396,'2016-04-27 08:37:53.213',112,'2016-04-27 08:39:04.630' union all
select 3403,'2016-04-27 08:46:36.530',105,'2016-04-27 08:47:15.960' union all
select 3408,'2016-04-27 08:53:44.273',2,'2016-04-27 08:53:53.480'
Go
DECLARE @StartDate DATE='2016-10-01'--每月1号由程序控制传参
DECLARE @Sql NVARCHAR(max)='',@EndDate DATE=DATEADD(mm,1,@StartDate),@DayQty TINYINT
SET @DayQty=DATEDIFF(dd,@StartDate,@EndDate)
WHILE @StartDate<@EndDate
SELECT @Sql=@Sql+',['+DATENAME(dd,@StartDate)+'号]=MAX(CASE WHEN DATENAME(dd,DDate)='+DATENAME(dd,@StartDate)+' THEN 显示 ELSE N''无打卡'' END)',@StartDate=DATEADD(dd,1,@StartDate)
SET @Sql=';With CTEA
as
(SELECT [perid] ,
DDate ,
CASE WHEN MinTime <= ''09:00''
AND MaxTime >= ''18:00'' THEN ''正常''
ELSE CASE WHEN MinTime <= ''09:00'' THEN ''''
WHEN MinTime BETWEEN ''09:00'' AND ''17:59'' THEN N''迟到''
WHEN MinTime IS NULL THEN ''缺打''
END + CASE WHEN MaxTime >= ''18:00'' THEN ''''
WHEN MaxTime IS NULL THEN ''缺打''
END
END AS 显示
,(CASE WHEN MinTime IS NULL OR MaxTime IS NULL THEN 1 ELSE 0 END) AS [缺打天数]
,(CASE WHEN MinTime BETWEEN ''09:00'' AND ''17:59'' THEN 1 ELSE 0 END) AS [迟到天数]
FROM ( SELECT [perid] ,
CAST(addtime AS DATE) AS DDate ,
CASE WHEN CONVERT(VARCHAR(5), MIN(addtime), 8) < ''18:00''
THEN CONVERT(VARCHAR(5), MIN(addtime), 8)
END AS MinTime ,
CASE WHEN CONVERT(VARCHAR(5), MAX(addtime), 8) >= ''18:00''
THEN CONVERT(VARCHAR(5), MAX(addtime), 8)
END AS MaxTime
FROM #T
WHERE addtime >= '''+CONVERT(VARCHAR(10),@StartDate,120)+''' AND addtime<'''+CONVERT(VARCHAR(10),@EndDate,120)+'''
GROUP BY [perid] ,
CAST(addtime AS DATE)
) AS T
)
SELECT [perid]
'+@Sql+'
,COUNT(*) AS 出勤天数
,SUM([缺打天数]) AS [缺打天数]
,SUM([迟到天数]) AS [迟到天数]
,'+RTRIM(@DayQty)+'-COUNT(*) AS [无打卡天数]
FROM CTEA
GROUP BY [perid]'
--PRINT @Sql
EXEC(@Sql)
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[addtime] Datetime,[perid] int,[signtime] Datetime)
Insert #T
select 1,'2016-04-20 08:57:17.880',2,'2016-04-20 08:57:44.263' union all
select 3,'2016-04-20 08:58:38.930',7,'2016-04-20 08:58:41.447' union all
select 4,'2016-04-20 08:58:42.693',22,'2016-04-20 08:59:11.323' union all
select 6,'2016-04-20 08:59:42.150',107,'2016-04-20 08:59:48.460' union all
select 9,'2016-04-20 09:00:25.043',1,'2016-04-20 09:00:39.357' union all
select 10,'2016-04-20 09:00:30.393',99,'2016-04-20 09:00:33.190' union all
select 64,'2016-04-20 09:57:10.980',1,'2016-04-20 09:57:21.630' union all
select 68,'2016-04-20 09:59:44.427',105,'2016-04-20 10:01:24.300' union all
select 354,'2016-04-20 18:15:07.743',2,'2016-04-20 18:16:10.397' union all
select 355,'2016-04-20 18:16:02.583',99,'2016-04-20 18:16:06.193' union all
select 356,'2016-04-20 18:16:37.543',7,'2016-04-20 18:16:40.897' union all
select 357,'2016-04-20 18:17:02.787',105,'2016-04-20 18:18:06.920' union all
select 358,'2016-04-20 18:17:08.937',107,'2016-04-20 18:18:08.790' union all
select 360,'2016-04-20 18:17:22.233',22,'2016-04-20 18:17:24.850' union all
select 388,'2016-04-20 19:21:17.770',34,'2016-04-20 19:21:33.587' union all
select 456,'2016-04-21 08:53:12.970',2,'2016-04-21 08:53:54.237' union all
select 458,'2016-04-21 08:56:52.740',107,'2016-04-21 08:56:57.783' union all
select 460,'2016-04-21 08:58:39.583',7,'2016-04-21 08:58:44.730' union all
select 462,'2016-04-21 08:59:06.070',99,'2016-04-21 08:59:08.453' union all
select 463,'2016-04-21 08:59:29.480',22,'2016-04-21 08:59:31.050' union all
select 480,'2016-04-21 09:34:30.993',105,'2016-04-21 09:34:34.537' union all
select 490,'2016-04-21 09:42:46.550',111,'2016-04-21 09:42:54.817' union all
select 491,'2016-04-21 09:43:16.053',112,'2016-04-21 09:43:19.010' union all
select 514,'2016-04-21 09:56:33.540',105,'2016-04-21 09:57:09.187' union all
select 517,'2016-04-21 09:57:24.080',105,'2016-04-21 09:57:26.227' union all
select 521,'2016-04-21 10:03:13.820',105,'2016-04-21 10:03:16.523' union all
select 571,'2016-04-21 11:39:04.620',1,'2016-04-21 11:39:37.060' union all
select 670,'2016-04-21 15:53:55.020',34,'2016-04-21 15:54:06.280' union all
select 723,'2016-04-21 19:14:08.137',2,'2016-04-21 19:14:17.187' union all
select 724,'2016-04-21 19:14:32.587',107,'2016-04-21 19:14:42.650' union all
select 725,'2016-04-21 19:14:38.420',7,'2016-04-21 19:14:41.157' union all
select 726,'2016-04-21 19:15:08.170',105,'2016-04-21 19:15:10.827' union all
select 728,'2016-04-21 19:15:34.587',99,'2016-04-21 19:15:37.133' union all
select 778,'2016-04-22 08:12:48.170',112,'2016-04-22 08:13:03.770' union all
select 813,'2016-04-22 08:57:30.573',2,'2016-04-22 08:57:55.283' union all
select 816,'2016-04-22 09:01:31.570',22,'2016-04-22 09:01:40.193' union all
select 817,'2016-04-22 09:01:39.253',7,'2016-04-22 09:02:07.550' union all
select 829,'2016-04-22 09:09:14.570',105,'2016-04-22 09:10:13.327' union all
select 836,'2016-04-22 09:18:39.307',99,'2016-04-22 09:18:43.273' union all
select 1239,'2016-04-22 17:02:29.543',7,'2016-04-22 17:02:32.590' union all
select 1304,'2016-04-22 19:01:30.980',112,'2016-04-22 19:01:40.497' union all
select 1311,'2016-04-22 19:08:01.357',105,'2016-04-22 19:08:05.527' union all
select 1312,'2016-04-22 19:08:42.620',105,'2016-04-22 19:08:47.760' union all
select 1314,'2016-04-22 19:09:40.507',7,'2016-04-22 19:09:44.367' union all
select 1315,'2016-04-22 19:10:45.520',99,'2016-04-22 19:10:50.000' union all
select 1317,'2016-04-22 19:11:21.040',22,'2016-04-22 19:11:26.097' union all
select 1324,'2016-04-22 19:20:05.173',2,'2016-04-22 19:20:32.737' union all
select 1811,'2016-04-24 14:09:07.737',107,'2016-04-24 14:09:15.130' union all
select 1824,'2016-04-24 14:23:03.697',7,'2016-04-24 14:23:39.540' union all
select 1826,'2016-04-24 14:23:26.257',2,'2016-04-24 14:23:33.120' union all
select 1829,'2016-04-24 14:26:30.553',22,'2016-04-24 14:26:41.117' union all
select 1832,'2016-04-24 14:28:10.387',99,'2016-04-24 14:28:12.457' union all
select 1840,'2016-04-24 14:33:14.160',112,'2016-04-24 14:33:25.513' union all
select 1845,'2016-04-24 14:35:38.290',112,'2016-04-24 14:35:42.120' union all
select 1849,'2016-04-24 14:36:53.400',105,'2016-04-24 14:37:01.133' union all
select 2010,'2016-04-24 16:59:54.453',7,'2016-04-24 17:00:19.370' union all
select 2011,'2016-04-24 17:01:03.860',2,'2016-04-24 17:01:14.830' union all
select 2012,'2016-04-24 17:06:04.140',22,'2016-04-24 17:06:25.920' union all
select 2013,'2016-04-24 17:06:30.770',99,'2016-04-24 17:06:35.157' union all
select 2018,'2016-04-24 17:09:19.590',99,'2016-04-24 17:09:26.903' union all
select 2024,'2016-04-24 17:14:19.757',112,'2016-04-24 17:14:23.527' union all
select 2027,'2016-04-24 17:20:55.700',107,'2016-04-24 17:21:00.160' union all
select 2048,'2016-04-24 17:51:01.910',105,'2016-04-24 17:51:44.887' union all
select 2128,'2016-04-25 08:54:52.230',112,'2016-04-25 08:55:45.013' union all
select 2129,'2016-04-25 08:55:55.903',2,'2016-04-25 08:56:13.177' union all
select 2131,'2016-04-25 08:56:43.410',7,'2016-04-25 08:56:48.930' union all
select 2132,'2016-04-25 08:56:54.260',22,'2016-04-25 08:56:55.947' union all
select 2133,'2016-04-25 08:57:04.767',22,'2016-04-25 08:57:13.647' union all
select 2138,'2016-04-25 08:58:48.437',99,'2016-04-25 08:59:58.480' union all
select 2140,'2016-04-25 08:59:58.580',105,'2016-04-25 09:00:19.157' union all
select 2142,'2016-04-25 09:00:33.620',99,'2016-04-25 09:00:40.550' union all
select 2172,'2016-04-25 09:15:52.783',107,'2016-04-25 09:16:52.790' union all
select 2212,'2016-04-25 09:33:26.413',70,'2016-04-25 09:34:36.667' union all
select 2907,'2016-04-25 18:53:35.943',7,'2016-04-25 18:54:02.210' union all
select 2908,'2016-04-25 18:53:43.920',105,'2016-04-25 18:54:08.087' union all
select 2909,'2016-04-25 18:53:45.137',107,'2016-04-25 18:54:16.847' union all
select 2910,'2016-04-25 18:54:05.267',112,'2016-04-25 18:54:12.090' union all
select 2911,'2016-04-25 18:54:29.120',128,'2016-04-25 18:55:53.053' union all
select 2912,'2016-04-25 18:54:36.293',99,'2016-04-25 18:54:39.620' union all
select 2920,'2016-04-25 18:58:47.703',2,'2016-04-25 18:59:18.027' union all
select 2979,'2016-04-26 08:55:55.280',105,'2016-04-26 08:56:31.597' union all
select 2980,'2016-04-26 08:55:57.617',2,'2016-04-26 08:56:05.287' union all
select 2981,'2016-04-26 08:56:26.690',22,'2016-04-26 08:56:32.857' union all
select 2982,'2016-04-26 08:56:37.260',7,'2016-04-26 08:56:40.077' union all
select 2983,'2016-04-26 08:57:06.440',99,'2016-04-26 08:57:08.620' union all
select 2985,'2016-04-26 08:57:14.323',128,'2016-04-26 08:57:25.350' union all
select 2991,'2016-04-26 09:02:41.207',1,'2016-04-26 09:03:00.243' union all
select 2993,'2016-04-26 09:04:08.927',112,'2016-04-26 09:04:16.037' union all
select 3061,'2016-04-26 13:53:55.430',99,'2016-04-26 13:54:42.450' union all
select 3295,'2016-04-26 19:12:12.040',112,'2016-04-26 19:12:19.023' union all
select 3299,'2016-04-26 19:14:09.003',105,'2016-04-26 19:14:56.330' union all
select 3305,'2016-04-26 19:15:44.793',128,'2016-04-26 19:15:48.253' union all
select 3308,'2016-04-26 19:17:56.480',2,'2016-04-26 19:18:17.387' union all
select 3309,'2016-04-26 19:18:02.833',7,'2016-04-26 19:18:06.280' union all
select 3310,'2016-04-26 19:18:48.040',99,'2016-04-26 19:18:51.730' union all
select 3330,'2016-04-26 19:28:03.630',7,'2016-04-26 19:28:30.093' union all
select 3344,'2016-04-26 19:40:34.237',22,'2016-04-26 19:40:40.253' union all
select 3396,'2016-04-27 08:37:53.213',112,'2016-04-27 08:39:04.630' union all
select 3403,'2016-04-27 08:46:36.530',105,'2016-04-27 08:47:15.960' union all
select 3408,'2016-04-27 08:53:44.273',2,'2016-04-27 08:53:53.480'
Go
DECLARE @StartDate DATE='2016-04-01'--每月1号由程序控制传参
DECLARE @Sql NVARCHAR(max)='',@EndDate DATE=DATEADD(mm,1,@StartDate),@DayQty TINYINT
SET @DayQty=DATEDIFF(dd,@StartDate,@EndDate)
WHILE @StartDate<@EndDate
SELECT @Sql=@Sql+',['+DATENAME(dd,@StartDate)+'号]=MAX(CASE WHEN DATENAME(dd,DDate)='+DATENAME(dd,@StartDate)+' THEN 显示 ELSE N''无打卡'' END)',@StartDate=DATEADD(dd,1,@StartDate)
SET @Sql=';With CTEA
as
(SELECT [perid] ,
DDate ,
CASE WHEN MinTime <= ''09:00''
AND MaxTime >= ''18:00'' THEN ''正常''
ELSE CASE WHEN MinTime <= ''09:00'' THEN ''''
WHEN MinTime BETWEEN ''09:00'' AND ''17:59'' THEN N''迟到''
WHEN MinTime IS NULL THEN ''缺打''
END + CASE WHEN MaxTime >= ''18:00'' THEN ''''
WHEN MaxTime IS NULL THEN ''缺打''
END
END AS 显示
,(CASE WHEN MinTime IS NULL OR MaxTime IS NULL THEN 1 ELSE 0 END) AS [缺打天数]
,(CASE WHEN MinTime BETWEEN ''09:00'' AND ''17:59'' THEN 1 ELSE 0 END) AS [迟到天数]
FROM ( SELECT [perid] ,
CAST(addtime AS DATE) AS DDate ,
CASE WHEN CONVERT(VARCHAR(5), MIN(addtime), 8) < ''18:00''
THEN CONVERT(VARCHAR(5), MIN(addtime), 8)
END AS MinTime ,
CASE WHEN CONVERT(VARCHAR(5), MAX(addtime), 8) >= ''18:00''
THEN CONVERT(VARCHAR(5), MAX(addtime), 8)
END AS MaxTime
FROM #T
GROUP BY [perid] ,
CAST(addtime AS DATE)
) AS T
)
SELECT [perid]
'+@Sql+'
,COUNT(*) AS 出勤天数
,SUM([缺打天数]) AS [缺打天数]
,SUM([迟到天数]) AS [迟到天数]
,'+RTRIM(@DayQty)+'-COUNT(*) AS [无打卡天数]
FROM CTEA
GROUP BY [perid]'
--PRINT @Sql
EXEC(@Sql)
DECLARE @StartDate DATE='2016-04-01'--每月1号由程序控制传参
DECLARE @Sql NVARCHAR(max)='',@EndDate DATE=DATEADD(mm,1,@StartDate),@DayQty TINYINT
SET @DayQty=DATEDIFF(dd,@StartDate,@EndDate)
WHILE @StartDate<@EndDate
SELECT @Sql=@Sql+',['+DATENAME(dd,@StartDate)+'号]=MAX(CASE WHEN DATENAME(dd,DDate)='+DATENAME(dd,@StartDate)+' THEN 显示 ELSE N''无打卡'' END)',@StartDate=DATEADD(dd,1,@StartDate)
SET @Sql=';With CTEA
as
(SELECT [perid] ,
DDate ,
CASE WHEN MinTime <= ''09:00''
AND MaxTime >= ''18:00'' THEN ''正常''
ELSE CASE WHEN MinTime <= ''09:00'' THEN ''''
WHEN MinTime BETWEEN ''09:00'' AND ''17:59'' THEN N''迟到''
WHEN MinTime IS NULL THEN ''缺打''
END + CASE WHEN MaxTime >= ''18:00'' THEN ''''
WHEN MaxTime IS NULL THEN ''缺打''
END
END AS 显示
,(CASE WHEN MinTime IS NULL OR MaxTime IS NULL THEN 1 ELSE 0 END) AS [缺打天数]
,(CASE WHEN MinTime BETWEEN ''09:00'' AND ''17:59'' THEN 1 ELSE 0 END) AS [迟到天数]
FROM ( SELECT [perid] ,
CAST(addtime AS DATE) AS DDate ,
CASE WHEN CONVERT(VARCHAR(5), MIN(addtime), 8) < ''18:00''
THEN CONVERT(VARCHAR(5), MIN(addtime), 8)
END AS MinTime ,
CASE WHEN CONVERT(VARCHAR(5), MAX(addtime), 8) >= ''18:00''
THEN CONVERT(VARCHAR(5), MAX(addtime), 8)
END AS MaxTime
FROM TabName
GROUP BY [perid] ,
CAST(addtime AS DATE)
) AS T
)
SELECT [perid]
'+@Sql+'
,COUNT(*) AS 出勤天数
,SUM([缺打天数]) AS [缺打天数]
,SUM([迟到天数]) AS [迟到天数]
,'+RTRIM(@DayQty)+'-COUNT(*) AS [无打卡天数]
FROM CTEA
GROUP BY [perid]'
PRINT @Sql
EXEC(@Sql)