Oracle使用同一列数据计算并更新到另外一列

本文介绍如何在Oracle数据库中,利用同一列的数据进行计算,并将计算结果更新到另一列。通过举例说明,展示如何对19年10月的开销记录进行自关联操作,计算每项支出占总开销的比例,然后使用MERGE INTO语句将这些比例更新到表的PROPORTION字段。

Oracle使用同一列数据计算并更新到另外一列

例如,我有一张表记录每月开销,建表语句如下

DROP TABLE TESTED.MONTH_SPEND CASCADE CONSTRAINTS;

CREATE TABLE TESTED.MONTH_SPEND(

    AMT NUMBER,
    S_TYPE VARCHAR2(100 CHAR),
    PROPORTION VARCHAR2 (20 CHAR),
    S_MONTH VARCHAR2(17 CHAR)
    

);

COMMENT ON TABLE TESTED.MONTH_SPEND IS '每月开销记录表';

COMMENT ON COLUMN TESTED.MONTH_SPEND.AMT IS '开销金额(元)';

COMMENT ON COLUMN TESTED.MONTH_SPEND.S_TYPE IS '支出类型';

COMMENT ON COLUMN TESTED.MONTH_SPEND.PROPORTION IS '开销占比';

COMMENT ON COLUMN TESTED.MONTH_SPEND.S_MONTH IS '支出月份';

19年10月开销花费数据记录

--清除已有数据
DELETE FROM TESTED.MONTH_SPEND  WHERE S_MONTH = '2019-10';
COMMIT;
--添加新数据
INSERT INTO TESTED.MONTH_SPEND VALUES(2000,'吃饭','','2019-10');
INSERT INTO TESTED.MONTH_SPEND VALUES(1000,'买衣服','','2019-10');
INSERT INTO TESTED.MONTH_SPEND VALUES(200,'出行','','2019-10');
INSERT INTO TESTED.MONTH_SPEND VALUES(5000,'旅游','','2019-10');
INSERT INTO TESTED.MONTH_SPEND VALUES(2300,'房租水电','','2019-10');
COMMIT;

计算合计

--计算本月支出合计
INSERT INTO TESTED.MONTH_SPEND (
            AMT, 
            S_TYPE, 
            PROPORTION,
            S_MONTH
            )
     SELECT SUM (AMT) AS AMT,
            '合计' AS S_TYPE, 
            PROPORTION,
            S_MONTH
       FROM TESTED.MONTH_SPEND
      WHERE S_MONTH = '2019-10'
   GROUP BY PROPORTION,S_MONTH;
COMMIT;

通过开销记录表自关联获取每项支出占比

        SELECT 
            A1.S_TYPE,
            CONCAT(ROUND(((A1.AMT/B.AMT)*100),2),'%') AS PROPORTION, 
            A1.S_MONTH
        FROM TESTED.MONTH_SPEND A1,TESTED.MONTH_SPEND B
        WHERE A1.S_MONTH = B.S_MONTH
        AND A1.S_MONTH = '2019-10'
        AND A1.S_TYPE <> '合计'
        AND B.S_TYPE = '合计'

通过MERGE INTO,将其更新到记账表PROPORTION字段中

MERGE INTO TESTED.MONTH_SPEND D
    USING (
        SELECT 
            A1.S_TYPE,  --支出类型
            CONCAT(ROUND(((A1.AMT/B.AMT)*100),2),'%') AS PROPORTION, --A1表各项支出/B表的合计支出,求出占比,并取两位小数四舍五入转为百分比值
            A1.S_MONTH  --支出的月度
        FROM TESTED.MONTH_SPEND A1,TESTED.MONTH_SPEND B --记账表自关联,计算出每项支出在合计中的占比
        WHERE A1.S_MONTH = B.S_MONTH    --自关联月度相同
        AND A1.S_MONTH = '2019-10'      --指定月度
        AND A1.S_TYPE <> '合计'          --A1表取出不是合计的所有支出金额
        AND B.S_TYPE = '合计') C         --B表取合计支出金额
     ON(D.S_TYPE = C.S_TYPE AND D.S_MONTH = C.S_MONTH)  
     WHEN MATCHED THEN
        UPDATE SET D.PROPORTION = C.PROPORTION --将自关联中取得的各项占比,通过ON继续自关联,将其更新到PROPORTION中
        WHERE D.S_MONTH = '2019-10';
     
     COMMIT;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值