Sql 数据透视表-日期数据行到列

Sql 数据透视表-日期数据行到列,sql,tsql,pivot,pivot-table,dynamic-columns,Sql,Tsql,Pivot,Pivot Table,Dynamic Columns,我有一个存储员工考勤打卡和打卡的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 1

我有一个存储员工考勤打卡和打卡的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
现在我希望数据如下所示:

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

我读过很多关于pivot表的文章,但是所有的pivot表都使用了特定数量的列,所以如何动态求解?

hello pradip,这是一个可行的解决方案,它将考勤表中分配的总天数作为列,但它不返回每天的总工作时间,它给出了每天的记录:谢谢你回答我 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 ')