Выражение CASE для сравнения продаж в годовом исчислении? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь сделать сравнение год от года с дисперсией продаж.У меня есть два оператора SQL ниже, которые извлекают нужные мне данные.Я думаю, что я должен использовать выражение CASE здесь?Если да, то примеры, на которые я смотрел, используют CASE WHEN YEAR (DATEFIELD) = DATE THEN X ELSE X END)?Что меня смущает, так это то, что наш финансовый год начинается в декабре, поэтому первый месяц данных приходится на другой год.Любые указания здесь действительно приветствуются.

Данные текущего финансового года

SELECT B.COMPANY, SUM(C.PRICE_BEFORE_TAX) AS CURRENTFY
FROM ARINVOICE A
 LEFT OUTER JOIN ARCUSTO B ON A.ARCUSTO_ID = B.ID
 LEFT OUTER JOIN V_ARINVOICE_DETAIL C ON A.ID = C.ARINVOICE_ID
WHERE TRUNC(A.INVOICE_DATE) >= TO_DATE('12/01/2018' , 'MM/DD/YYYY') 
AND TRUNC(A.INVOICE_DATE) <= TO_DATE('11/30/2019' , 'MM/DD/YYYY')
GROUP BY B.COMPANY
ORDER BY CURRENTFY DESC)

Данные последнего финансового года

(SELECT B.COMPANY, SUM(C.PRICE_BEFORE_TAX) AS LASTFY
 FROM ARINVOICE A
 LEFT OUTER JOIN ARCUSTO B ON A.ARCUSTO_ID = B.ID
 LEFT OUTER JOIN V_ARINVOICE_DETAIL C ON A.ID = C.ARINVOICE_ID
 WHERE TRUNC(A.INVOICE_DATE) >= TO_DATE('12/01/2017' , 'MM/DD/YYYY') 
 AND TRUNC(A.INVOICE_DATE) <= (SYSDATE-365)
 GROUP BY B.COMPANY
 ORDER BY LASTFY DESC))

Желаемые результаты

SELECT B.COMPANY, CURRENTFY, LASTFY, (((CURRENTFY-LASTFY)/CURRENTFY)*100) AS SALESVARIANCE

РЕДАКТИРОВАТЬ ---------------------

Я использую следующее благодаря Гордон

SELECT c.COMPANY,
   SUM(CASE WHEN id.INVOICE_DATE >= DATE '2018-12-01' AND id.INVOICE_DATE <= DATE '2019-12-01'
        THEN id.PRICE_BEFORE_TAX
   END) AS CURRENTFY,
   SUM(CASE WHEN id.INVOICE_DATE >= DATE '2017-12-01' AND id.INVOICE_DATE <= (SYSDATE-365)
        THEN id.PRICE_BEFORE_TAX
   END) AS LASTFY,
ROUND(((SUM(CASE WHEN id.INVOICE_DATE >= DATE '2018-12-01' AND id.INVOICE_DATE <= DATE '2019-12-01'
        THEN id.PRICE_BEFORE_TAX
   END) -
   SUM(CASE WHEN id.INVOICE_DATE >= DATE '2017-12-01' AND id.INVOICE_DATE <= (SYSDATE-365)
        THEN id.PRICE_BEFORE_TAX
   END))/(SUM(CASE WHEN id.INVOICE_DATE >= DATE '2018-12-01' AND id.INVOICE_DATE <= DATE '2019-12-01'
        THEN id.PRICE_BEFORE_TAX
   END)))*100 , 2) AS SALESVARIANCE
FROM ARINVOICE i LEFT JOIN
 ARCUSTO c
 ON i.ARCUSTO_ID = c.ID LEFT JOIN
 V_ARINVOICE_DETAIL id
 ON i.ID = id.ARINVOICE_ID
GROUP BY c.COMPANY
ORDER BY CURRENTFY DESC

1 Ответ

0 голосов
/ 01 марта 2019

Просто используйте условное агрегирование:

SELECT c.COMPANY,
       SUM(CASE WHEN id.INVOICE_DATE >= DATE '2018-12-01' AND id.INVOICE_DATE < DATE '2019-12-01'
                THEN id.PRICE_BEFORE_TAX
           END) AS CURRENTFY,
       SUM(CASE WHEN id.INVOICE_DATE >= DATE '2017-12-01' AND id.INVOICE_DATE < DATE '2018-12-01'
                THEN id.PRICE_BEFORE_TAX
           END) AS LASTFY
FROM ARINVOICE i LEFT JOIN
     ARCUSTO c
     ON i.ARCUSTO_ID = c.ID LEFT JOIN
     V_ARINVOICE_DETAIL id
     ON i.ID = id.ARINVOICE_ID
GROUP BY c.COMPANY
ORDER BY CURRENTFY DESC;

Примечания:

  • Это меняет псевдонимы таблицы на значимые, а не произвольные буквы.
  • Используетсяключевое слово DATE для констант даты.
  • Сравнение даты используется непосредственно для значений, поэтому извлечение части счета из даты не требуется.
  • Я удалил сравнение времени в WHERE так что проще добавить больше финансовых лет.Очевидно, что вы все еще можете фильтровать значения за последние два года.
...