У меня есть отчет, который показывает данные за предыдущие две недели. Я хотел бы, чтобы любое мероприятие, которое происходит в выходные дни, было включено в пятницу, а любое мероприятие в праздничный день было включено в деловой день до этого.
Этот запрос является источником для файла Power BI, поэтому я могу применить фильтр в BI, чтобы исключить праздничные и выходные дни, и это здорово. Тем не менее, я хотел бы, чтобы любое действие, происходящее в эти дни, было включено в другие дни.
Вот код, который у меня есть. Поля IsHoliday и IsWeekday - это двоичные поля размером 0,1, которые позволяют фильтровать результаты в Power BI:
DECLARE @currenttime as DATE, @currentmonthyear as varchar (50)
SET @currenttime = getutcdate() at time zone 'UTC' at time zone 'Central
Standard Time'
SET @currentmonthyear =
CONVERT(char(3),@currenttime,0)+''+DATENAME(YEAR,@currenttime)
SELECT
---Dates
CONVERT(CHAR(3),l.originearliest,0)+'-'+DATENAME(YEAR,l.originearliest)
as PresentationMonth
,cal.Date as CalDate
,concat(month(cal.date),'-',day(cal.date),'-',year(cal.date)) as Date
,cal.IsHoliday
,cal.IsWeekday
---BizDays
,mv.BizDays
,bz.BizDaysMTD
---Metrics
,r.office
,c.Name as Customer_Name
,l.customercode as Customer_Code
,CASE
WHEN lx.BookedLoadCustomerRep is NULL THEN r.KeypointUserCode
ELSE BookedLoadCustomerRep
END AS Customer_Rep
,l.Dispatcher as Carrier_Rep
---Revenue
,SUM(CUSTOMERRATE) as Revenue
,SUM(CUSTOMERRATE)/COUNT(l.LoadNumber) as RPL
---Cost
,SUM(CarrierCost) as Cost
---Spread
,(SUM(CUSTOMERRATE)-SUM(CarrierCost)) as Spread
,(SUM(CUSTOMERRATE)-SUM(CarrierCost))/COUNT(l.LoadNumber)as SPL
---Loads
,COUNT(l.LoadNumber) as Loads
FROM kpo.Load l
left join ops.Customer c on c.customerid=l.customerid
left join rpt.reportuser r on r.userid=c.SalespersonUserId
left join kpo.LoadExtension lx on lx.LoadNumber=l.LoadNumber
left join rpt.MonthView mv on
CONVERT(char(3),l.originearliest,0)+''+DATENAME(YEAR,l.originearliest) = MonthYear
left join com.Calendar cal on convert(date,cal.Date) = convert(date,l.OriginEarliest)
INNER JOIN
(SELECT
MonthYear,
CASE WHEN
CONVERT(char(3),@currenttime,0)+''+DATENAME(YEAR,@currenttime) = MonthYear
THEN (BizDaysMTD)-1
ELSE BizDaysMTD
END as BizDaysMTD
from rpt.MonthView) bz on bz.MonthYear = mv.MonthYear
WHERE
CONVERT(DATE,l.OriginEarliest) <=
(CASE
when DATENAME(WEEKDAY,@currenttime)='Saturday'
THEN DATEADD(DY,-1,@currenttime)
WHEN DATENAME(WEEKDAY,@currenttime)='Sunday'
THEN DATEADD(DY,-2,@currenttime)
WHEN DATENAME(WEEKDAY,@currenttime)='Monday'
THEN DATEADD(DY,-3,@currenttime)
ELSE DATEADD(DY,-1,@currenttime)
END)
AND
YEAR(l.originearliest)>='2014'
AND
l.OrderStatus not in ('void','available')
AND
DATEDIFF(DAY,l.originearliest,@currenttime) between 1 and 14
GROUP BY
r.office
,c.Name
,DATEPART(WEEK,l.originearliest)
,Month(l.originearliest)
,Year(l.originearliest)
,Year(l.originearliest)+'-'+Month(l.originearliest)
,mv.MonthYear
,BizDays
,bz.BizDaysMTD
,l.CustomerCode
,l.OriginEarliest
,lx.BookedLoadCustomerRep
,r.KeypointUserCode
,l.dispatcher
,cal.IsHoliday
,cal.IsWeekday
,cal.Date
ORDER BY
Year(l.originearliest) desc
,Month(l.originearliest) desc
Любая помощь будет принята с благодарностью!