У нас есть отчет с начала года, который запускается ежемесячно. Я хотел бы рассчитать движение MTD для каждого месяца, выполнив расчет Месяц + 1 минус Месяц0 = MTD

Данные согласно ниже в одной таблице

Month | Account | YTD amount
Jan   | AB123   | 100
Feb   | AB123   | 200
Mar   | AB123   | 350

У меня есть много аккаунтов, для которых мне понадобится MTD, как показано ниже.

Month | Account | MTD Amount
Jan   | AB123   | 100
Feb   | AB123   | 100
Mar   | AB123   | 150

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

SELECT A.[Month]
  ,A.[Account]
  ,A.[YTD] FebYTD
  ,B.[YTD] JanYTD
  ,A.[YTD] - B.[YTD] MTD
FROM 
(
SELECT [Month]
   ,[Account]
   ,[YTD]
FROM [PWC_2017].[dbo].[MTD test]
where [Month] = 'Feb'
) A
join
(
SELECT [Month]
  ,[Account]
  ,[YTD]
FROM [PWC_2017].[dbo].[MTD test]
Where [Month] = 'Jan'
) B
on A.[Account] = B.[Account]

Результаты ниже

Month | Account | FebYTD | JanYTD | MTD
Feb   | AB123   |   200  |  100   | 100

Я хотел бы сделать один запрос, который я мог бы запускать каждый месяц. Так, например, когда наступит сентябрьский месяц, он даст мне 9 рядов МПД. Ян - Сентябрь В основном это будет работать на все месяцы, доступные в таблице в настоящее время. Спасибо.

0
gemmo 29 Май 2017 в 06:21

2 ответа

Лучший ответ

Вы можете попробовать следующий запрос

SELECT Current.[Month], 
       Current.[Account], 
       Current.[YTD]                                       CurrentYTD, 
       Next.[YTD]                                          NextYTD, 
       COALESCE(Next.[YTD], Current.[YTD]) - Current.[YTD] MTD 
FROM   (SELECT [Month], 
               CASE [Month] 
                 WHEN 'Jan' THEN 1 
                 WHEN 'Feb' THEN 2 
                 WHEN 'Mar' THEN 3 
                 WHEN 'Apr' THEN 4 
                 WHEN 'May' THEN 5 
                 WHEN 'June' THEN 6 
                 WHEN 'July' THEN 7 
                 WHEN 'Aug' THEN 8 
                 WHEN 'Sept' THEN 9 
                 WHEN 'Oct' THEN 10 
                 WHEN 'Nov' THEN 11 
                 WHEN 'Dec' THEN 12 
               END AS [MonthId], 
               [Account], 
               [YTD] 
        FROM   [PWC_2017].[dbo].[MTD test]) Current 
       LEFT JOIN (SELECT [Month], 
                         CASE [Month] 
                           WHEN 'Jan' THEN 1 
                           WHEN 'Feb' THEN 2 
                           WHEN 'Mar' THEN 3 
                           WHEN 'Apr' THEN 4 
                           WHEN 'May' THEN 5 
                           WHEN 'June' THEN 6 
                           WHEN 'July' THEN 7 
                           WHEN 'Aug' THEN 8 
                           WHEN 'Sept' THEN 9 
                           WHEN 'Oct' THEN 10 
                           WHEN 'Nov' THEN 11 
                           WHEN 'Dec' THEN 12 
                         END AS [MonthId], 
                         [Account], 
                         [YTD] 
                  FROM   [PWC_2017].[dbo].[MTD test]) Next 
              ON Current.[Account] = Next.[Account] 
                 And Current.[MonthId] + 1 = Next.[MonthId] 
0
Trung Duong 29 Май 2017 в 06:11

Одно незначительное дополнение к вышесказанному.

На основании предпосылки сравнения с YTD-1 и включения случая для MTD, хотя январь решается для примера, он не работает, например, когда данные записываются только за март. Первый MTD будет NULL.

Так что я просто добавил ноль, когда не существует никакого предыдущего с начала года,

CASE CurrentYTD.Month_ID
WHEN 1 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0) 
WHEN 2 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 3 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 4 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 5 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 6 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 7 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 8 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 9 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 10 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 11 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
WHEN 12 Then COALESCE (CurrentYTD.Amount,PreviousYTD.Amount)- COALESCE(PreviousYTD.Amount,0)
END AS Amount_MTD
1
Wim F 17 Апр 2018 в 09:43