Я не уверен на 100%, каковы ваши требования, но почти как будто вы хотите объединить сводную таблицу.
Я сделал это быстро, так что это может не совсем соответствовать вашим потребностям, но в любом случае ...
Я создал временную таблицу с именем #timesheet и добавил несколько значений:
CREATE TABLE #timesheet
(
Task VARCHAR(10),
employee INT,
StartDate DATETIME,
endDate DATETIME
)
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task1',10,'2011-5-10 17:00:00','2011-5-10 20:00:00' )
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task1', 10, '2011-5-12 17:00:00', '2011-5-12 20:00:00' )
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task2',10,'2011-5-12 17:00:00','2011-5-12 20:00:00' )
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task1', 12, '2011-5-08 17:00:00', '2011-5-08 20:00:00' )
Я создал функцию GetWeekDayNameOfDate, взятую из Kodyaz Development Services , чтобы получить день днянеделю.
Сначала я создал сводный запрос, как показано ниже:
SELECT #timesheet.Task,
#timesheet.employee,
MIN(#timesheet.StartDate) AS [Start Date],
MAX(#timesheet.endDate) AS [End Date],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate)) / 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate)) % 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee
Это даст мне сводку по задаче и сотруднику.Он покажет дату начала и дату окончания всей продолжительности, а также сколько часов и минут.
Мои результаты будут такими:
Task employee Start Date End Date Hours Minutes
---------- ----------- ----------------------- ----------------------- ----------- -----------
Task1 10 2011-05-10 17:00:00.000 2011-05-12 20:00:00.000 6 0
Task2 10 2011-05-12 17:00:00.000 2011-05-12 20:00:00.000 3 0
Task1 12 2011-05-08 17:00:00.000 2011-05-08 20:00:00.000 3 0
Затем я создал сводный запрос сведений для суммирования.количество часов, потраченных на каждый день недели.
SELECT Task,
Employee,
ISNULL([Sunday], 0) AS Sunday,
ISNULL([Monday], 0) AS Monday,
ISNULL([Tuesday], 0) AS Tuesday,
ISNULL([Wednesday], 0) AS Wendesday,
ISNULL([Thursday], 0) AS Thursday,
ISNULL([Friday], 0) AS Friday,
ISNULL([Saturday], 0) AS Saturday
FROM ( SELECT #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate) AS [Day],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
/ 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
% 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate)
) p PIVOT ( SUM(Hours) FOR [DAY] IN ( [Sunday], [Monday], [Tuesday],
[Wednesday], [Thursday],
[Friday], [Saturday] ) ) AS PivotTable
Мои результаты будут такими:
Task Employee Sunday Monday Tuesday Wendesday Thursday Friday Saturday
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Task1 10 0 0 3 0 3 0 0
Task1 12 3 0 0 0 0 0 0
Task2 10 0 0 0 0 3 0 0
В обратном направлении я соединил два своих запроса вместе, чтобы получить полную картину
SELECT summary.Task,
summary.employee,
summary.[Start Date],
summary.[End Date],
details.Sunday,
details.Monday,
details.Tuesday,
details.Wendesday,
details.Thursday,
details.Friday,
details.Saturday,
summary.Hours,
summary.Minutes
FROM ( SELECT #timesheet.Task,
#timesheet.employee,
MIN(#timesheet.StartDate) AS [Start Date],
MAX(#timesheet.endDate) AS [End Date],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
/ 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
% 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee
) summary
INNER JOIN ( SELECT Task,
Employee,
ISNULL([Sunday], 0) AS Sunday,
ISNULL([Monday], 0) AS Monday,
ISNULL([Tuesday], 0) AS Tuesday,
ISNULL([Wednesday], 0) AS Wendesday,
ISNULL([Thursday], 0) AS Thursday,
ISNULL([Friday], 0) AS Friday,
ISNULL([Saturday], 0) AS Saturday
FROM ( SELECT #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate) AS [Day],
SUM(DATEDIFF(n, #timesheet.StartDate,
#timesheet.endDate)) / 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate,
#timesheet.endDate)) % 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate)
) p PIVOT ( SUM(Hours) FOR [DAY] IN ( [Sunday], [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday] ) ) AS PivotTable
) details ON summary.Task = details.Task
AND summary.Employee = details.Employee
Поступая таким образом, я получил бы следующий результат:
Task employee Start Date End Date Sunday Monday Tuesday Wendesday Thursday Friday Saturday Hours Minutes
---------- ----------- ----------------------- ----------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Task1 10 2011-05-10 17:00:00.000 2011-05-12 20:00:00.000 0 0 3 0 3 0 0 6 0
Task1 12 2011-05-08 17:00:00.000 2011-05-08 20:00:00.000 3 0 0 0 0 0 0 3 0
Task2 10 2011-05-12 17:00:00.000 2011-05-12 20:00:00.000 0 0 0 0 3 0 0 3 0
Имейте в виду, я в значительной степени проигнорировал часть минут, но я надеюсь, что по крайней мере это может быть полезно для вас.