2015-08-31 48 views
0

我有一个SQL表,存储员工的出勤率(冲入和冲出),我目前正在努力获取表中存储的每一天的总工作时间(总天数大约是22〜30天最高).. 存储的数据如下图所示:数据透视表 - 日期数据行到列

ID date  time  Status 
1 01/08/2015 08:00 AM IN 
1 01/08/2015 01:00 PM OUT 
1 01/08/2015 02:30 PM IN 
1 01/08/2015 07:30 PM OUT 
1 02/08/2015 11:00 AM IN 
1 02/08/2015 06:00 PM OUT 
1 02/08/2015 09:30 PM IN 
1 03/08/2015 02:30 AM OUT 
1 03/08/2015 08:00 AM IN 
1 03/08/2015 06:00 PM OUT 
1 04/08/2015 08:00 AM IN 
1 04/08/2015 06:00 PM OUT 

现在我希望数据是象下面这样:

ID 01/08/2015 02/08/2015 03/08/2015 04/08/2015 total 
1  10   12   10   10  42 
2  9   10   10   11  40 

我读了很多有关的文章数据透视表,但他们都使用其中的特定数量的列,所以如何解决它动态吗?

回答

2
 
DECLARE @cols AS VARCHAR(MAX) 
DECLARE @query AS VARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(cast(CONVERT(VARCHAR(20), Edate,103) as varchar(10))) 
        from 
        ( 
        select a1.Edate from (
         SELECT DISTINCT Edate 
         from InOut 
        )a1 

        ) t 

      FOR XML PATH(''), TYPE 
      ).value('.', 'VARCHAR(MAX)') 
     ,1,1,'') 

    EXEC(' SELECT Id,' + @cols + '  
      from 
      ( 
       select Id, 
       Edate , 
       status 
       from 
       ( 
       select convert(varchar(20), Edate,103)Edate, Id,status 
       from InOut 
      ) src 
      ) x 
      pivot 
      ( 
       count(status) 
       for Edate in (' + @cols + ') 
      ) p where 1=1 ') 
+0

hello pradip,这是一个可行的解决方案,它给出了出席表中分配的总天数作为列,但它并没有返回总工作时间,它给出了每个记录的计数一天:谢谢你回答我 –