Как добавить значения выходных и праздничных дней в предыдущий рабочий день - PullRequest
0 голосов
/ 14 ноября 2018

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

**DAYS      VALUE** 
2018-01-01  10  Holiday-1
2018-01-02  20  
2018-01-03  30  
2018-01-04  40  
2018-01-05  50  
2018-01-06  60  Saturday
2018-01-07  70  Sunday
2018-01-08  80  
2018-01-09  90  
2018-01-10  100 Holiday-2

ВЫХОД

2018-01-02  20  
2018-01-03  30  
2018-01-04  40  
2018-01-05  180 
2018-01-08  80  
2018-01-09  190 

Я пытаюсь с LEAD, LAG, DATEDIFF и другими способами, но не получаю никакого решения, поэтому, пожалуйста, ребята, помогите ему сэта проблема.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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

Тогда совокупность:

select max(days) as days, sum(value)
from (select t.*,
             sum(case when holiday is null then 1 else 0 end) over (order by days asc) as grp
      from t
     ) t
group by grp;

EDIT:

С отдельным праздничным столом вам нужно просто добавить join:

select max(days) as days, sum(value)
from (select t.*,
             sum(case when h.holiday is null then 1 else 0 end) over (order by t.days asc) as grp
      from t left join
           holidays h
           on t.days = h.date
     ) t
group by grp;
0 голосов
/ 14 ноября 2018

Если в вашей таблице календаря праздников есть строка (я предполагаю, что выходные тоже есть), вам нужно найти максимальную дату, предшествующую текущей, для которой в таблице праздников нет строки.Затем сгруппируйте по этой «реальной дате» и суммируйте значение.Как то так:

declare @t table([DAYS] date, [VALUE] int)
declare @Holidays table([DAYS] date, Note varchar(100))

insert into @t values
('2018-01-01',  10),
('2018-01-02',  20),
('2018-01-03',  30),
('2018-01-04',  40),
('2018-01-05',  50),
('2018-01-06',  60),
('2018-01-07',  70),
('2018-01-08',  80),
('2018-01-09',  90),
('2018-01-10',  100)

insert into @Holidays values
('2018-01-01',  'Holiday-1'),
('2018-01-06',  'Saturday'),
('2018-01-07',  'Sunday'),
('2018-01-10',  'Holiday-2')

;with cte as (
select 
    IIF(h1.[DAYS] is not null /* i.e. it is a holiday */,
         (select max([DAYS])
          from @t t2
          where t2.[DAYS] < t1.[DAYS] and not exists(select * from @Holidays h2 where h2.[DAYS] = t2.[DAYS])), t1.[DAYS]) as RealDate
    , t1.[VALUE]
from @t t1
left join @Holidays h1 on t1.DAYS = h1.[DAYS]
)
select
    RealDate
    , sum([VALUE]) as RealValue
from cte
where RealDate is not null
group by RealDate
...