sql表透视

sql表透视,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图做一个查询,返回每个员工整个月(30天)的结果。 数据如下: employeeID day DayDutyDate fromTime Period 1 26 2014-03-26 2000-01-01 09:30:00.000 Time1 1 26 2014-03-26 2000-01-01 14:00:00.000 Time2 1 27 2014-03-27 2

我试图做一个查询,返回每个员工整个月(30天)的结果。 数据如下:

employeeID day DayDutyDate   fromTime                   Period
1           26  2014-03-26  2000-01-01 09:30:00.000     Time1
1           26  2014-03-26  2000-01-01 14:00:00.000     Time2
1           27  2014-03-27  2000-01-01 09:30:00.000     Time1
1           27  2014-03-26  2000-01-01 14:00:00.000     Time2
PIVOT ( MIN(fromtime) FOR days IN ( [26],[27]) (I am being breif not listing all month days right now)
EmployeeID 26                       27
1          2000-01-01 09:30:00.000  null
1          2000-01-01 14:00:00.000  null
1          null                     2000-01-01 09:30:00.000  
1          null                     2000-01-01 14:00:00.000
我将在以下几天进行重点讨论:

employeeID day DayDutyDate   fromTime                   Period
1           26  2014-03-26  2000-01-01 09:30:00.000     Time1
1           26  2014-03-26  2000-01-01 14:00:00.000     Time2
1           27  2014-03-27  2000-01-01 09:30:00.000     Time1
1           27  2014-03-26  2000-01-01 14:00:00.000     Time2
PIVOT ( MIN(fromtime) FOR days IN ( [26],[27]) (I am being breif not listing all month days right now)
EmployeeID 26                       27
1          2000-01-01 09:30:00.000  null
1          2000-01-01 14:00:00.000  null
1          null                     2000-01-01 09:30:00.000  
1          null                     2000-01-01 14:00:00.000
结果如下:

employeeID day DayDutyDate   fromTime                   Period
1           26  2014-03-26  2000-01-01 09:30:00.000     Time1
1           26  2014-03-26  2000-01-01 14:00:00.000     Time2
1           27  2014-03-27  2000-01-01 09:30:00.000     Time1
1           27  2014-03-26  2000-01-01 14:00:00.000     Time2
PIVOT ( MIN(fromtime) FOR days IN ( [26],[27]) (I am being breif not listing all month days right now)
EmployeeID 26                       27
1          2000-01-01 09:30:00.000  null
1          2000-01-01 14:00:00.000  null
1          null                     2000-01-01 09:30:00.000  
1          null                     2000-01-01 14:00:00.000
我需要的是:

EmployeeID 26                       27
1          2000-01-01 09:30:00.000  2000-01-01 09:30:00.000
1          2000-01-01 14:00:00.000  2000-01-01 14:00:00.000
有什么想法吗?

这个查询:

SELECT employeeID, [26], [27], Period
FROM 
(SELECT employeeID, [day], fromtime, Period
FROM #MyTable) p
PIVOT
(
MIN(fromtime)
FOR [day] IN
( [26], [27])
) AS pvt
生成此输出:

employeeID  26                      27                     Period
==================================================================
1           2000-01-01 09:30:00.000 2000-01-01 09:30:00.000 Time1
1           2000-01-01 14:00:00.000 2000-01-01 14:00:00.000 Time2

您还可以使用动态SQL来透视数据。请参见下面的示例:

DECLARE @cols as varchar(max)
DECLARE @sql as varchar(max)

SELECT @cols  = coalesce(@cols  + ',','') + '[' + day + ']' FROM #MyTable

SET @sql = 
         'SELECT employeeID, ' + @cols + ', Period
           FROM (
                 SELECT employeeID, [day], fromtime, Period
                 FROM #MyTable
                 ) as P
           PIVOT 
                 (
                 MIN(fromtime)FOR [day] IN (' + @cols + ')
                 )AS pvt'

EXEC(@sql)

您能提供完整的查询吗?为什么第26天和第27天的起始日期相同?2000-01-01