T-SQL Pivot для отображения одного комментария в неделю - PullRequest
0 голосов
/ 17 сентября 2010

Меня попросили изменить сводный запрос, который в настоящее время отображает дату окончания недели, категорию и часы по дате для одной недели подряд. Меня попросили отобразить поле комментария в конце строки, и я не могу понять, как изменить запрос, чтобы сделать это.

Таблица структурирована следующим образом

Category   Date      Comments     Hours
test       8/2/2010  myComment      2
test       8/3/2010                 8
test       8/4/2010                 4
test       8/5/2010                 3
test       8/6/2010                 5

Я бы хотел, чтобы данные отображались следующим образом. У меня есть запрос, который будет отображать все это, кроме комментария. На переднем крае я собираюсь разрешить только один комментарий в неделю и добавить его в строку с датой понедельника в таблице для каждой комбинации недели / категории.

WeekEnding Category  SunHrs MonHrs TuesHrs WedHrs ThuHrs FriHrs SatHrs  Comment
8/7/2010   test      0      1      1     1      1      1      1       myComment

Вот запрос перед добавлением поля комментария, который работает нормально.

DECLARE @WeekEnding datetime
DECLARE @UserName nvarchar(245)

SET @WeekEnding = '09/04/2010'
SET @UserName = 'brogers'


SELECT
   @WeekEnding      WeekEnding

  ,CategoryID
  ,isnull([1], 0)  SunHrs
  ,isnull([2], 0)  MonHrs
  ,isnull([3], 0)  TueHrs
  ,isnull([4], 0)  WedHrs
  ,isnull([5], 0)  ThuHrs
  ,isnull([6], 0)  FriHrs
  ,isnull([7], 0)  SatHrs
 from (select  CategoryID, Datepart(dw, TimeEntryDate) DOW, TimeEntryDuration Hours
        from dbo.aspnet_starterkits_TimeEntry
        where TimeEntryDate between dateadd(dd,  -6, @WeekEnding) and @WeekEnding) Source
  pivot (max(Hours) for DOW in ([1],[2],[3],[4],[5],[6],[7]) ) as pvt

Я не уверен, как добавить поле комментария в конец строки. Когда я добавляю его, я получаю результат, подобный этому

WeekEnding Category  SunHrs MonHrs TuesHrs WedHrs ThuHrs FriHrs SatHrs  Comment
8/7/2010   test      0      0      1       1      1      1      0       

8/7/2010   test      0      1      0       0      0      0      0       myComment

Мне нужна только одна строка для каждой комбинации выходного дня / категории и один комментарий на строку в выходных данных. Вот запрос, в который я добавил поле комментария и отображается некорректно.

Может кто-нибудь указать, как отображать один комментарий в неделю / строку категории?

DECLARE @WeekEnding datetime
DECLARE @UserName nvarchar(245)

SET @WeekEnding = '09/04/2010'
SET @UserName = 'brogers'


SELECT
   @WeekEnding      WeekEnding
  ,TimeEntryDescription 
  ,CategoryID
  ,isnull([1], 0)  SunHrs
  ,isnull([2], 0)  MonHrs
  ,isnull([3], 0)  TueHrs
  ,isnull([4], 0)  WedHrs
  ,isnull([5], 0)  ThuHrs
  ,isnull([6], 0)  FriHrs
  ,isnull([7], 0)  SatHrs
 from (select  
        CategoryID, 
        Datepart(dw, TimeEntryDate) DOW, 
        TimeEntryDuration Hours, 
        TimeEntryDescription
        from dbo.aspnet_starterkits_TimeEntry
        where TimeEntryDate between dateadd(dd,  -6, @WeekEnding) and @WeekEnding) Source
  pivot (max(Hours) for DOW in ([1],[2],[3],[4],[5],[6],[7]) ) as pvt

Несмотря на то, что в исходной таблице есть поле комментария для каждого дня недели, я хочу только один комментарий в неделю и одну строку в неделю / комбинацию категорий.

Я ограничу ввод только одним разом в неделю (например, понедельник) и хочу, чтобы этот комментарий отображался в конце строки выходного запроса.

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

Это, вероятно, проще с опорой старого стиля

;With [Source] As
(
select  
        CategoryID, 
        Datepart(dw, TimeEntryDate) DOW, 
        TimeEntryDuration Hours, 
        TimeEntryDescription
        from dbo.aspnet_starterkits_TimeEntry
        where TimeEntryDate between dateadd(dd,  -6, @WeekEnding) and @WeekEnding
)
SELECT
   @WeekEnding      WeekEnding
  ,TimeEntryDescription 
  ,CategoryID
  ,max(case when DOW = 1 then [Hours] else 0 end)  SunHrs
  ,max(case when DOW = 2 then [Hours] else 0 end)  MonHrs
  ,max(case when DOW = 3 then [Hours] else 0 end)  TueHrs
  ,max(case when DOW = 4 then [Hours] else 0 end)  WedHrs
  ,max(case when DOW = 5 then [Hours] else 0 end)  ThuHrs
  ,max(case when DOW = 6 then [Hours] else 0 end)  FriHrs
  ,max(case when DOW = 7 then [Hours] else 0 end)  SatHrs
  ,max(comment) as comment
 from [Source]
 group by 
   TimeEntryDescription 
  ,CategoryID
0 голосов
/ 17 сентября 2010

Соедините сводную таблицу с исходной таблицей на дату и получите min(comment).

DECLARE @WeekEnding datetime
DECLARE @UserName nvarchar(245)

SET @WeekEnding = '09/04/2010'
SET @UserName = 'brogers'

;with Report as (
SELECT
   @WeekEnding      WeekEnding
  ,TimeEntryDescription 
  ,CategoryID
  ,isnull([1], 0)  SunHrs
  ,isnull([2], 0)  MonHrs
  ,isnull([3], 0)  TueHrs
  ,isnull([4], 0)  WedHrs
  ,isnull([5], 0)  ThuHrs
  ,isnull([6], 0)  FriHrs
  ,isnull([7], 0)  SatHrs
 from (select  
        CategoryID, 
        Datepart(dw, TimeEntryDate) DOW, 
        TimeEntryDuration Hours, 
        TimeEntryDescription
        from dbo.aspnet_starterkits_TimeEntry
        where TimeEntryDate between dateadd(dd,  -6, @WeekEnding) and @WeekEnding) Source
  pivot (max(Hours) for DOW in ([1],[2],[3],[4],[5],[6],[7]) ) as pvt
)
select * 
,(select min(comment) from dbo.aspnet_starterkits_TimeEntry te where TimeEntryDate between dateadd(dd,  -6, @WeekEnding) and @WeekEnding)) [Comment]
from Report r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...