一个表,如下
工号   姓名    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
该结果每月的第一天都要做,能否做成存储过程??

解决方案 »

  1.   

    周六、周日用下面的函数来判断
    select @@datefirst--一周第一条
    datepart(weekday,getdate())--在一周中的哪一天
      

  2.   

    if object_id('tb')is not null drop table tb
    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*/
      

  3.   

    DECLARE @TB TABLE(工号 VARCHAR(3),  姓名 NVARCHAR(2),    [20081101] VARCHAR(8),  [20081102] VARCHAR(8),  [20081103] VARCHAR(8))
    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
    */
      

  4.   

    逐个select是不行的,因为肯定不止是3行数据啊!如果是3行,还用做汇总吗,直接用手算还更快啊!