2015-01-27 5 views
0

Я пытаюсь сделать запрос, который возвращает результат для каждого сотрудника в течение всего месяца (30 дней). данные следующим образом:sql table pivot

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 

Любая идея?

+0

Можете ли вы предоставить полный запрос? –

+0

Почему у 26 и 27 дней одинаковые даты? 2000-01-01 – Bobby

ответ

0

Этот запрос:

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 
+0

большое спасибо :) –

0

Вы также можете использовать динамический 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)