SQL: отменить итоговую сумму YTD с LAG, затем повторно объединить с группировкой по - PullRequest
0 голосов
/ 29 октября 2018

Фон

Я работаю с ежемесячными отпускными часами на уровне сотрудников (FYTD), которые берут на себя 20 тыс. Сотрудников, начиная с 6 лет. В таблице не менее 20 миллионов записей.

Примечание Наш финансовый год начинается 1 сентября.

Пример таблицы

| Month  | Country | Employee | Vacation_Hours_YTD |
|--------|---------|----------|--------------------|
| 201707 | USA     | A        | 92                 |
| 201708 | USA     | A        | 100                |
| 201709 | USA     | A        | 6                  |
| 201710 | USA     | A        | 15                 |
| 201707 | USA     | B        | 60                 |
| 201708 | USA     | B        | 60                 |
| 201709 | USA     | B        | 10                 |
| 201710 | USA     | B        | 12                 |
| 201707 | CA      | X        | 82                 |
| 201708 | CA      | X        | 94                 |
| 201709 | CA      | X        | 7                  |
| 201710 | CA      | X        | 20                 |
| 201707 | CA      | Y        | 45                 |
| 201708 | CA      | Y        | 80                 |
| 201709 | CA      | Y        | 0                  |
| 201710 | CA      | Y        | 12                 |

Желаемый выход

| Month  | Country | Total_Vacation_Hours |
|--------|---------|----------------------|
| 201708 | USA     | 8                    |
| 201709 | USA     | 16                   |
| 201710 | USA     | 11                   |
| 201708 | CA      | 43                   |
| 201709 | CA      | 7                    |
| 201710 | CA      | 25                   |

Мне нужно:

  1. Отмените расчет с начала года, чтобы получить месячную сумму, и
  2. Группировка по стране в часах по стране в месяц.

Моя попытка

Я сделал LAG() GROUP BY и CASE WHEN отдельно. Но у меня проблемы с их объединением. Я также не знаю, как разобрать финансовый год из столбца Месяц.

SELECT
   [Month]
   ,[Country]
   ,SUM([Vacation_Hours_YTD]) - coalesce(lag(SUM([Vacation_Hours_YTD])) over (partition by [Country] order by [Month]), 0) as 'Total_Vacation_Hours'
  FROM Vacation_YTD_Table
GROUP BY    [Month],[Country]

1 Ответ

0 голосов
/ 29 октября 2018

Ваш запрос почти получил, суть в месяце сентября, вы не вычитаете из предыдущего кумулятивного показателя

; with
cte as
(
    select  Month, Country, Employee, 
            Vacation_Hours  = Vacation_Hours_YTD 
                            - CASE  WHEN Month % 100 = 9 -- Sept
                                    THEN 0
                                    ELSE LAG(Vacation_Hours_YTD) 
                                         OVER (PARTITION BY Country, Employee 
                                                   ORDER BY Month)
                                    END
    from    Vacation_YTD_Table
)
select  Month, Country, SUM(Vacation_Hours) as Total_Vacation_Hours 
from    cte 
where   Vacation_Hours  is not null  -- this is to exclude 201707
group by Month, Country
order by Month
...