Группировка отчетов SSRS по нескольким полям - PullRequest
2 голосов
/ 29 января 2020

У меня есть отчет, который мы назовем ReportOne, в этом ReportOne я запрашиваю данные для этого отчета с помощью хранимой процедуры. Запрос хранимой процедуры возвращает два значения: «TravelDate» и «Status».

В моем отчете четыре поля: «BeginDate», «EndDate», «Status» и «Days».

Моя проблема в том, что мне нужно сгруппировать отчет по Статус и дни подряд. Последующие дни от TravelDate.

«BeginDate» будет первой новой датой

«EndDate» будет последней последовательной датой.

«Status» будет статусом.

«Дни» - это количество последовательных дней.

Пример,

TravelDate | Status

1/1/2001   | Leave
1/2/2001   | Leave
1/3/2001   | Leave
1/5/2001   | Leave
1/6/2001   | Travel

Отчет будет выглядеть следующим образом.

BeginDate | EndDate  | Status | Days

1/1/2001  | 1/3/2001 | Leave  | 3

1/5/2001  | 1/5/2001 | Leave  | 1

1/6/2001  | 1/6/2001 | Travel | 1

1 Ответ

2 голосов
/ 29 января 2020

Пример

Declare @YourTable Table ([TravelDate] date,[Status] varchar(50))
Insert Into @YourTable Values 
 ('1/1/2001','Leave')
,('1/2/2001','Leave')
,('1/3/2001','Leave')
,('1/5/2001','Leave')
,('1/6/2001','Travel')


Select BeginDate=min(TravelDate)
      ,EndDate  =max(TravelDate)
      ,Status   =max(Status)
      ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
 From (
        Select * 
              ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
         From @YourTable
      ) A
 Group By Grp
 Order By BeginDate

Возвращает

BeginDate   EndDate     Status  Days
2001-01-01  2001-01-03  Leave   3
2001-01-05  2001-01-05  Leave   1
2001-01-06  2001-01-06  Travel  1

EDIT - захват из хранимой процедуры - структура @YourTable должен соответствовать структуре хранимой процедуры

Declare @YourTable Table ([TravelDate] date,[Status] varchar(50))
Insert Into @YourTable 
Exec youStoredProcedure

    Select BeginDate=min(TravelDate)
          ,EndDate  =max(TravelDate)
          ,Status   =max(Status)
          ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
     From (
            Select * 
                  ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
             From @YourTable
          ) A
     Group By Grp
     Order By BeginDate

EDIT - вложенный подзапрос

Select BeginDate=min(TravelDate)
      ,EndDate  =max(TravelDate)
      ,Status   =max(Status)
      ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
 From (
        Select * 
              ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
         From (
                -- Your Query Here --- 
              ) A
      ) A
 Group By Grp
 Order By BeginDate

EDIT - потребляется из TVF

Select BeginDate=min(TravelDate)
      ,EndDate  =max(TravelDate)
      ,Status   =max(Status)
      ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
 From (
        Select * 
              ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
         From [dbo].[YourTableValedFunction](Param1,Param2) src
      ) A
 Group By Grp
 Order By BeginDate
...