Oracle 计算同比环比

需求:写一个存储过程,实现存储日期,销售渠道,当前订单金额,上年同期订单金额,上月同期订单金额,按日期和销售渠道分组,并记录日志

前提:日期字段类型均为INTEGER,格式为 YYYYMMDD

CREATE OR REPLACE PROCEDURE DMR_sales_report_0102 AS
  --定义全局变量,当前日期,上年同期,上月同期
  cur_date INTEGER := TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD'));
  last_year_date INTEGER := TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE, -12),'YYYYMMDD'));
  last_month_date INTEGER := TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE, -1),'YYYYMMDD'));
BEGIN
  -- 插入查询结果到报告表中
  INSERT INTO sales_report_0102 (
    report_date, --日期
    sales_channel,  --销售渠道
    cur_order_amount,  --当前订单金额
    last_year_order_amount,  --上年同期订单金额
    last_month_order_amount  --上月同期订单金额
    )
    --当期
  SELECT
    order_date AS report_date,
    sales_channel,
    SUM(order_amount) AS cur_order_amount,
    0 AS last_year_order_amount,
    0 AS last_month_order_amount
  FROM
    orders
  WHERE order_date = cur_date
  GROUP BY
    order_date,
    sales_channel
 UNION ALL
 --上年同期
 SELECT
    order_date AS report_date,
    sales_channel,
    0 AS cur_order_amount,
    SUM(order_amount) AS last_year_order_amount,
    0 AS last_month_order_amount
  FROM
    orders
  WHERE order_date = last_year_date
  GROUP BY
    order_date,
    sales_channel
 UNION ALL
 --上月同期
 SELECT
    order_date AS report_date,
    sales_channel,
    0 AS cur_order_amount,
    0 AS last_year_order_amount,
    SUM(order_amount) AS last_month_order_amount
  FROM
    orders
  WHERE order_date = last_month_date
  GROUP BY
    order_date,
    sales_channel;

COMMIT;
    
  -- 记录日志
  INSERT INTO log_table (log_date, operation) VALUES (SYSDATE, 'Sales report generated successfully.');
  
  --结束存储过程
  DBMS_OUTPUT.PUT_LINE('Sales report generated successfully.');
EXCEPTION
  WHEN OTHERS THEN
    -- 记录日志并向用户返回错误消息
    INSERT INTO log_table (log_date, operation) VALUES (SYSDATE, 'Sales report failed: ' || SQLERRM);
    DBMS_OUTPUT.PUT_LINE('Sales report failed: ' || SQLERRM);
END;

使用以下语句来运行此存储过程: 

--执行存储过程
EXECUTE DMR_sales_report_0102;

 由存过加工出当期,上年同期,上月同期的订单金额后,可以拿来计算同比和环比指标了

  • 同比:(当期/上年同期 -1)*100%
  • 环比:(当期/上月同期 -1)*100%
SELECT
    cur_order_amount,  --当期
    CONCAT(ROUND((cur_order_amount/last_year_order_amount - 1) *100, 2), '%') AS LY_ORDER_RATIO,  --同比
    CONCAT(ROUND((cur_order_amount/last_month_order_amount - 1) *100, 2), '%') AS LM_ORDER_RATIO  --环比
FROM sales_report_0102
WHERE report_date = 20231203

 如果不写存储过程,并且日期类型为DATE的话,可以参考下面的SQL加工得到当期,上年同期和上月同期的值

SELECT
  TO_CHAR(order_date, 'YYYY-MM-DD') AS order_date,
  sales_channel,
  SUM(CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM SYSDATE) THEN order_amount ELSE 0 END) AS cur_order_amount,
  SUM(CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) THEN order_amount ELSE 0 END) AS last_year_order_amount,
  SUM(CASE WHEN EXTRACT(MONTH FROM order_date) = EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE,-1)) AND EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM SYSDATE) THEN order_amount ELSE 0 END) AS last_month_order_amount
FROM
  orders
GROUP BY
  TO_CHAR(order_date, 'YYYY-MM-DD'),
  sales_channel;

然后再套用同比环比计算公式求取指标。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值