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;

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

被折叠的 条评论
为什么被折叠?



