一个表,如下
工号 姓名 20081101 20081102 20081103 (一直到20081130)
001 人1 1 0 4
002 人2 2 0 0
003 人3 0 0 0
需要在最后面加一列,(假设列名为:0次汇总)
最后一列的需求是将200801-20081130中不是周六、周日的日子里面,统计其中数字为0的个数,例如在上面例子中,工号001增加一列的结果是0,工号002的结果是1,003的结果是1,因为20081101和20081102是周六和周日。
结果是:
工号 姓名 20081101......20081130 0次汇总
001 人1 1............xx 0
002 人2 2............xx 1
003 人3 0 xx 1
该结果每月的第一天都要做,能否做成存储过程??
工号 姓名 20081101 20081102 20081103 (一直到20081130)
001 人1 1 0 4
002 人2 2 0 0
003 人3 0 0 0
需要在最后面加一列,(假设列名为:0次汇总)
最后一列的需求是将200801-20081130中不是周六、周日的日子里面,统计其中数字为0的个数,例如在上面例子中,工号001增加一列的结果是0,工号002的结果是1,003的结果是1,因为20081101和20081102是周六和周日。
结果是:
工号 姓名 20081101......20081130 0次汇总
001 人1 1............xx 0
002 人2 2............xx 1
003 人3 0 xx 1
该结果每月的第一天都要做,能否做成存储过程??
select @@datefirst--一周第一条
datepart(weekday,getdate())--在一周中的哪一天
go
create table tb(工号 varchar(5), 姓名 varchar(5), [20081101] int , [20081102] int, [20081103] int)
insert tb select '001' ,'人1', 1 , 0 , 4
insert tb select '002' ,'人2' , 2 , 0 , 0
insert tb select '003' , '人3' , 0 , 0 , 0
select a.*,b.[0次汇总] from tb a ,(
select 工号,count(*)[0次汇总] from (
select 工号, [20081101] [0次汇总] from tb
union all
select 工号, [20081102] from tb
union all
select 工号, [20081103] from tb) t where [0次汇总]=0 group by 工号)b where a.工号=b.工号
/*工号 姓名 20081101 20081102 20081103 0次汇总
----- ----- ----------- ----------- ----------- -----------
001 人1 1 0 4 1
002 人2 2 0 0 2
003 人3 0 0 0 3*/
INSERT @TB
SELECT '001', N'人1', 1, 0, 4 UNION ALL
SELECT '002', N'人2', 2, 0, 0 UNION ALL
SELECT '003', N'人3', 0, 0, 0SET DATEFIRST 1SELECT A.*,TOTAL
FROM @TB AS A JOIN (
SELECT 工号,SUM(CASE WHEN COL<>0 THEN 0 ELSE 1 END) AS TOTAL
FROM (
SELECT 工号, [20081101] AS COL,DATEPART(DW,CONVERT(VARCHAR(10),CAST('20081101' AS DATETIME),120)) AS DW FROM @TB UNION ALL
SELECT 工号, [20081102] AS COL,DATEPART(DW,CONVERT(VARCHAR(10),CAST('20081102' AS DATETIME),120)) AS DW FROM @TB UNION ALL
SELECT 工号, [20081103] AS COL,DATEPART(DW,CONVERT(VARCHAR(10),CAST('20081103' AS DATETIME),120)) AS DW FROM @TB
) T
WHERE DW NOT IN (6, 7)
GROUP BY 工号
) B
ON A.工号=B.工号
/*
工号 姓名 20081101 20081102 20081103 TOTAL
---- ---- -------- -------- -------- -----------
001 人1 1 0 4 0
002 人2 2 0 0 1
003 人3 0 0 0 1
*/