【问题标题】:CASE Expression For Year Over Year Sales Comparison?年度销售额比较的 CASE 表达式?
【发布时间】:2019-03-01 16:43:52
【问题描述】:

我正在尝试与销售差异进行逐年比较。我在下面有两个 SQL 语句,它们可以提取我想要的正确数据。我想我应该在这里使用 CASE 表达式?如果是这样,我一直在查看的示例使用 CASE WHEN YEAR (DATEFIELD) = DATE THEN X ELSE X END)?让我困惑的是,我们的 FY 是从 12 月开始的,所以第一个月的数据来自不同的年份。非常感谢这里的任何指导。

当前财年数据

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

编辑---------

感谢 Gordon,我正在使用以下内容

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

【问题讨论】:

    标签: sql oracle case oracle12c


    【解决方案1】:

    只需使用条件聚合:

    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 中的时间比较,以便更容易添加更多会计年度。显然,您仍然可以过滤过去两年的值。

    【讨论】:

    • Gordon,感谢您的指导,以及注释。这些非常有帮助。我收到错误:ORA-00920:现在无效的关系运算符。
    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多