В sql-запросе я пытаюсь сделать две вещи.Использование XML PATH для управления данными строки при группировке
У меня есть таблица Attendance
как этот
ТАБЛИЦА
EID | PID | In_Time | Out_Time | Shift
__________________________________________________________
100 | S001 | 2014-05-01 07:10 | 2014-05-01 19:20 | D
100 | S001 | 2014-05-04 07:00 | 2014-05-04 19:00 | D
100 | S001 | 2014-05-04 19:00 | 2014-05-05 07:00 | N
ВИЗ -EmployeeID
PID -PointID (Location)
D - день Сдвиг
N - Night Shift
Когда (будет принято При группировке только DatePart
из In_Time
полей) I группы по всем полям, кроме смены, я хочу, чтобы получить эту
Промежуточным этапом
EID | DAY | Shift |
___________________
100 | 01 | D |
100 | 04 | D/N |
И наконец, я хочу PIVOT
это, чтобы получить следующий результат
ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ ФИНАЛ
EmployeeID | 01 | 02 | 03 | 04 |
__________________________________
100 | D | _ | _ | D/N |
Я использую следующий запрос в этой цели, но я получаю немного другой результат.
SELECT EID AS EmployeeID, [1],[2],[3],[4]
FROM (
SELECT
EID, datepart(dd,in_time) as [DAY],
STUFF((
SELECT '/ ' + Shift
FROM Attendance
WHERE ([in_time] = Results.[in_time])
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') AS Shifts
FROM Attendance Results
WHERE EID = '100' AND PID ='C002'
GROUP BY EID , in_time
) AS SourceTable
PIVOT
(
MAX (Shifts)
FOR [DAY] IN ([1],[2],[3],[4])
) AS PivotTable
Это результат запроса
EmployeeID | 01 | 02 | 03 | 04 |
________________________________
100 | D | _ | _ | N/N |
Так что-то не так в моем запросе, и вы могли бы мольбы помочь мне разобраться в этом? Что мне не хватает в этом запросе? Вы знаете лучший способ сделать это?
EDIT: Я просто понял, что приведенный выше код работает хорошо, если таблица посещаемости содержит записи, относящиеся к одному сотруднику и одной точке (PID).
Если приведенная выше таблица содержит сведения о нескольких сотрудниках (EID), которые работают в разных местах (PID), тогда неправильный вариант. Таким образом, я вижу, что код не является согласованным, но моих знаний в sql кажется недостаточно, чтобы разобраться в этом без помощи :(
Как насчет Out_Time = 2014-05-05 07:00. Он не отображается в вашем желаемом результате. Неужели вы смотрели только на время работы рабочего дня? –
@ Jithin Shaji, Да, сдвиг относится к дню In_Time. Поэтому я не хочу получать Out_Time. Out_Time будет использоваться только для категоризации сдвигов. – Deva
Я удалил ненужные вещи, чтобы сделать его более простым. – Deva