Как переформатировать мой запрос SQL Server? - PullRequest
0 голосов
/ 15 ноября 2011

Я написал SQL-запрос, который приводит результат в следующем формате

ResourceName    ProjectName  TaskName Timesheet Period  ActualWork  TimeByDay  DayName

    Jim Carry        Project A   Task A   2011-12           40        09/10/2011  Monday

     Jim Carry        Project A   Task A   2011-12           70        09/10/2011  Monday
     Jim Carry        Project B   Task A   2011-12           80        09/12/2011  Tue.
     Perth S.         Project A   Task A   2011-12           35        09/10/2011  Mon.

Я хочу написать запрос, чтобы он выглядел примерно так:

ResourceName    ProjectName         TaskName         Timesheet Period  Monday Tue  
Jim Carry           Project A        Task A            2011-12          110    80

Как вы видите, новые столбцы создаются во втором имени запроса, как понедельник, вторник и так далее. Кроме того, общая сумма также рассчитывается на основе дня, и, следовательно, результат столбца понедельника равен 40 + 70, а значения вторника - 80 + 0.

Ниже приведен запрос, который приводит фрагмент кода 1

DECLARE @startdate DATETIME
DECLARE @enddate DATETIME

SET @startdate='1/1/2011'
SET @enddate='12/31/2011'

SELECT TOP 100 [IR.TimesheetProjectHoursByDay].ResourceName,
               [IR.TimesheetProjectHoursByDay].ProjectName,
               [IR.TimesheetProjectHoursByDay].TaskName,
               [IR.TimesheetProjectHoursByDay].PeriodName + ' ' + '(' + CONVERT(NVARCHAR, [IR.TimesheetProjectHoursByDay].PeriodStartDate, 101) + ' - ' + CONVERT(NVARCHAR, [IR.TimesheetProjectHoursByDay].PeriodEndDate, 101) + ')' AS [Timesheet Period],
               [IR.TimesheetProjectHoursByDay].ActualWork,
               [IR.TimesheetProjectHoursByDay].TimeByDay,
              DATENAME(dw,TimeByDay) as [DayName]
FROM   [IR.TimesheetProjectHoursByDay]
WHERE  [IR.TimesheetProjectHoursByDay].TimeByDay >= @StartDate
       AND [IR.TimesheetProjectHoursByDay].TimeByDay <= @EndDate
       AND [IR.TimesheetProjectHoursByDay].[Project Departments] LIKE N'CSENG'
       AND [IR.TimesheetProjectHoursByDay].ActualWork > 0
       AND [IR.TimesheetProjectHoursByDay].ResourceName LIKE '%Jim%'
GROUP  BY [IR.TimesheetProjectHoursByDay].TimeByDay,
          [IR.TimesheetProjectHoursByDay].ResourceName,
          [IR.TimesheetProjectHoursByDay].ProjectName,
          [IR.TimesheetProjectHoursByDay].TaskName,
          [IR.TimesheetProjectHoursByDay].[Project Departments],
          [IR.TimesheetProjectHoursByDay].ResourceStandardRate,
          [IR.TimesheetProjectHoursByDay].PeriodName,
          [IR.TimesheetProjectHoursByDay].PeriodStartDate,
          [IR.TimesheetProjectHoursByDay].PeriodEndDate,
          [IR.TimesheetProjectHoursByDay].ActualWork
ORDER  BY [IR.TimesheetProjectHoursByDay].TimeByDay DESC 

Подскажите, пожалуйста, какие изменения мне нужно внести в SQL-запрос, чтобы я мог получить результат, как указано во фрагменте кода 2?

Дайте мне знать, если требуется какой-либо вклад. Пожалуйста, ознакомьтесь с таблицей тестовых данных, которая делает вещи более понятными на здесь Пожалуйста, руководство!

Спасибо!

Ответы [ 3 ]

0 голосов
/ 15 ноября 2011

Похоже, вы могли бы использовать PIVOT для этого; взгляните на этот пример .

0 голосов
/ 15 ноября 2011

Если я правильно вас понял, вы можете попробовать это:

create table #tbl (ResourceName varchar(100), ProjectName varchar(100), TaskName varchar(100), ActualWork int, TimeByDay date)

insert into #tbl values    ('Jim Carry','Project A','Task A',40,'20111009'),
('Jim Carry','Project A','Task A',70,'20111009'),
('Jim Carry','Project B','Task B',80,'20111209'),
('Perth S.','Project A','Task A',35,'20111209')

select ResourceName,ProjectName, year(TimeByDay), MONTH(TimeByDay),
       sum(case when datename(weekday, TimeByDay)='Monday' then ActualWork else 0 end) Monday,
       sum(case when datename(weekday, TimeByDay)='Tuesday' then ActualWork else 0 end) Tuesday,
       sum(case when datename(weekday, TimeByDay)='Wednesday' then ActualWork else 0 end) Wednesday,
       sum(case when datename(weekday, TimeByDay)='Thursday' then ActualWork else 0 end) Thursday,
       sum(case when datename(weekday, TimeByDay)='Thursday' then ActualWork else 0 end) Thursday,
       sum(case when datename(weekday, TimeByDay)='Friday' then ActualWork else 0 end) Friday,
       sum(case when datename(weekday, TimeByDay)='Saturday' then ActualWork else 0 end) Saturday,
       sum(case when datename(weekday, TimeByDay)='Sunday' then ActualWork else 0 end) Sunday
from #tbl
group by ResourceName,ProjectName, year(TimeByDay), MONTH(TimeByDay)

drop table #tbl

Вы также можете использовать PIVOT , как рекомендовано CJM.

0 голосов
/ 15 ноября 2011

Учитывая, что вы предполагаете, что это на самом деле не имеет значения, поскольку вы только после общего количества часов, отработанных ресурсом в данный день, вы можете попробовать что-то вроде ( Примечание : это не проверено, но простопример);

SELECT TOP 100 [IR.TimesheetProjectHoursByDay].ResourceName,
[IR.TimesheetProjectHoursByDay].TimeByDay,
SUM([IR.TimesheetProjectHoursByDay].ActualWork) OVER(PARTITION BY [IR.TimesheetProjectHoursByDay].TimeByDay) AS "Total Hours"

И затем использовать это как производную таблицу, из которой можно организовать дни.Недавно на простом разговорном сайте был большой пост по оконным функциям .Прочтите.Это поучительно.

...