原表  
select * from tab 
序号 工作号 姓名 类别 标准出勤 实际出勤 额外出勤 考勤日期           更新日期
1 2000019 张三 科长 8 8 0 2010-6-1 0:00 2010-6-5 14:14
2 2000020 李四 处长 8 9 1 2010-6-2 0:00 2010-6-5 14:14
3 2000021 王五 局长 8 8 0 2010-6-3 0:00 2010-6-5 14:15
4 2000019 张三 科长 8 10 0 2010-6-3 0:00 2010-6-6 14:15
想要的结果~第一排的日期是实际出勤工作号 姓名 2010-6-1 2010-6-2 2010-6-3
2000019 张三 8 10
2000020 李四 9
2000021 王五 8
求助高人~~

解决方案 »

  1.   

    可以参考 MSSQL 2005 列转行应用案例
      

  2.   


    CREATE TABLE tab (序号 INT, 工作号 INT, 姓名 NVARCHAR(10)
                    , 类别 NVARCHAR(10), 标准出勤 INT, 实际出勤 INT
                    , 额外出勤 INT, 考勤日期 DATETIME, 更新日期 DATETIME)
                    
    INSERT INTO tab VALUES (1, 2000019, N'张三', N'科长', 8, 8, 0, '2010-6-1 0:00', '2010-6-5 14:14')
    INSERT INTO tab VALUES (2, 2000020, N'李四', N'处长', 8, 9, 1, '2010-6-2 0:00', '2010-6-5 14:14')
    INSERT INTO tab VALUES (3, 2000021, N'王五', N'局长', 8, 8, 0, '2010-6-3 0:00', '2010-6-5 14:15')
    INSERT INTO tab VALUES (4, 2000019, N'张三', N'科长', 8, 10, 0, '2010-6-3 0:00', '2010-6-6 14:15')
    DECLARE @sql NVARCHAR(4000)
    SET @sql = N'SELECT 工作号,姓名'
    SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
    FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab)A
    SELECT @sql = @sql + N' FROM tab GROUP BY 工作号,姓名'
    --PRINT @sql
    EXEC (@sql)
      

  3.   


    非常感谢,如果想要让考勤日期段限制在当前月。
    where加在那里呢?
      

  4.   


    DECLARE @sql NVARCHAR(4000)
    SET @sql = N'SELECT 工作号,姓名'
    SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
    FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab)A
    SELECT @sql = @sql + N' FROM tab where GROUP BY 工作号,姓名'
    --PRINT @sql
    EXEC (@sql)
      

  5.   


    use PracticeDB
    if object_id('[TB]') is not null 
    drop table [TB]
    CREATE TABLE tb (序号 INT, 工作号 INT, 姓名 NVARCHAR(10)
                    , 类别 NVARCHAR(10), 标准出勤 INT, 实际出勤 INT
                    , 额外出勤 INT, 考勤日期 DATETIME, 更新日期 DATETIME)
                    
    INSERT INTO tb VALUES (1, 2000019, N'张三', N'科长', 8, 8, 0, '2010-6-1 0:00', '2010-6-5 14:14')
    INSERT INTO tb VALUES (2, 2000020, N'李四', N'处长', 8, 9, 1, '2010-6-2 0:00', '2010-6-5 14:14')
    INSERT INTO tb VALUES (3, 2000021, N'王五', N'局长', 8, 8, 0, '2010-6-3 0:00', '2010-6-5 14:15')
    INSERT INTO tb VALUES (4, 2000019, N'张三', N'科长', 8, 10, 0, '2010-6-3 0:00', '2010-6-6 14:15')
    select 工作号, 姓名 ,sum(case when CONVERT(varchar(10),考勤日期,120)='2010-06-01' then 实际出勤 else 0 end) as [2010-6-1],
                         sum(case when CONVERT(varchar(10),考勤日期,120)='2010-06-02' then 实际出勤 else 0 end) as [2010-6-2],
                         sum(case when CONVERT(varchar(10),考勤日期,120)='2010-06-03' then 实际出勤 else 0 end) as [2010-6-3]
    from tb
    where left(CONVERT(varchar(7),考勤日期,107),2)=left(CONVERT(varchar(7),GETDATE(),107),2)
    group by 工作号, 姓名 工作号 姓名 2010-6-1 2010-6-2 2010-6-3
    2000020 李四 0 9 0
    2000021 王五 0 0 8
    2000019 张三 8 0 10
      

  6.   


    declare @s nvarchar(max)
    set @s=''
    select @s=@s+','+QUOTENAME( CONVERT(varchar(10),考勤日期,120))+'= sum( case CONVERT(varchar(10),考勤日期,120) when '''+CONVERT(varchar(10),考勤日期,120)+''' then 实际出勤 else 0 end)'
    from tb
    group by CONVERT(varchar(10),考勤日期,120)
    exec ('select 工作号, 姓名 '+@s+' from tb where left(CONVERT(varchar(7),考勤日期,107),2)=left(CONVERT(varchar(7),GETDATE(),107),2) group by 工作号, 姓名 ')
    工作号 姓名 2010-06-01 2010-06-02 2010-06-03
    2000020 李四 0 9 0
    2000021 王五 0 0 8
    2000019 张三 8 0 10
      

  7.   


    其实第一个人的回复就 可以但是想介于日期之间查询 考勤日期比如 介于DTPicker1  and  DTPicker2 之间可以么?
      

  8.   

    不知道下面两种是不是你想要的DECLARE @DTPicker1 DATETIME
    DECLARE @DTPicker2 DATETIMESET @DTPicker1 = '2010-06-1'
    SET @DTPicker2 = '2010-06-2'DECLARE @sql NVARCHAR(4000)
    SET @sql = N'SELECT 工作号,姓名'
    SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
    FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab)A
    SELECT @sql = @sql + N' FROM tab WHERE 考勤日期 BETWEEN ''' 
            + CONVERT(NVARCHAR(10),@DTPicker1,120) + N''' AND ''' 
            + CONVERT(NVARCHAR(10),@DTPicker2,120) + N''' GROUP BY 工作号,姓名'
    --PRINT @sql
    EXEC (@sql)
    GODECLARE @DTPicker1 DATETIME
    DECLARE @DTPicker2 DATETIMESET @DTPicker1 = '2010-06-1'
    SET @DTPicker2 = '2010-06-2'DECLARE @sql NVARCHAR(4000)
    SET @sql = N'SELECT 工作号,姓名'
    SELECT @sql = @sql + N',MAX(CASE WHEN [考勤日期] = ''' + 考勤日期 + N''' THEN 实际出勤 END) AS [' + 考勤日期 + N']'
    FROM (SELECT DISTINCT CONVERT(NVARCHAR(10),考勤日期,120)AS 考勤日期 FROM tab 
          WHERE 考勤日期 BETWEEN @DTPicker1 AND @DTPicker2)A
    SELECT @sql = @sql + N' FROM tab GROUP BY 工作号,姓名'
    --PRINT @sql
    EXEC (@sql)
      

  9.   


    declare @s nvarchar(max),
            @DTPicker1 varchar(10),
            @DTPicker2 varchar(10)
    set @s=''
    set @DTPicker1='2010-06-01'
    set @DTPicker2='2010-06-30'
    select @s=@s+','+QUOTENAME( CONVERT(varchar(10),考勤日期,120))+'= sum( case CONVERT(varchar(10),考勤日期,120) when '''+CONVERT(varchar(10),考勤日期,120)+''' then 实际出勤 else 0 end)'
    from tb
    group by CONVERT(varchar(10),考勤日期,120)
    exec ('select 工作号, 姓名 '+@s+' from tb where CONVERT(varchar(10),考勤日期,120) >= '''+ @DTPicker1 +''' and  CONVERT(varchar(10),考勤日期,120) <= '''+ @DTPicker2 +''' group by 工作号, 姓名 ')