相关文章推荐
胆小的打火机  ·  ORACLE ...·  2 周前    · 
微醺的匕首  ·  oracle 中模糊查询 ...·  2 周前    · 
博学的柳树  ·  SQL*Plus远程访问ORACLE ...·  1 周前    · 
正直的手电筒  ·  缓存和连接池·  2 天前    · 
越狱的排球  ·  ruby on rails - PG ...·  1 年前    · 
冷静的香菇  ·  c++ ...·  1 年前    · 
没人理的骆驼  ·  python - Scraping: ...·  1 年前    · 

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 (
            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;
merge into table1 using (select t.idd ,max(t.val) m from table2 t group by t.idd)table2 on (table1.idd = table2.idd) when matched then update set table1.val = table2.m 概述ORACLE函数系Oracle常见函数大全Oracle-分析函数之连续求和sum(…) over(…)Oracle-分析函数之排序值rank()和dense_rank()Oracle-分析函数之排序后顺序号row_number()Oracle-分析函数之取上下行数据lag()和lead()这两个函数是偏移量函数,可以查出一个字段的上一个值或者下一个值,配合over来使用。lead函数,这个... 之前在项目中导入基础数据时,因为代码写的不够完善,导致一些数据没有正确导入,在系统中重新导入所有基础数据又太麻烦,所以想到把没导入数据库的单独放入EXCEL中,通过PL\SQL导入到数据库中,并通过一个表的更新另一个表对应的。 一、在oracle数据库中建立一个临时表,我的叫CELL_ANGLE,其表结构如图: 二、准备导入的数据,excel版本为2007,文件名为angle. 这种查询称为相关子查询.根据您的要求,查询如下….update students sset s.department = (select e.qualificationfrom employee ewhere s.uniquename = e.uniquenameand s.Homecountry = e.Homecountry);根据您的回复更新此帖子.再次,继续,始终发布创建表并插入语句(和预... 建表语句:create table table1(idd varchar2(10) ,val varchar2(20));create table table2(idd varchar2(10),val varchar2(20));插入数据:insert into table1 values ('01','1111');insert into table1 values ('02','222');... ----查询排序,特定300-400行的数据 SELECT B.R,B.* FROM (SELECT ROWNUM R, T.* FROM SYS_ACTIVECODE T WHERE ROWNUM <= 400 and t.USEDFLAG='0' and t.ACTCODE_TYPE='2D... 之前在项目中导入基础数据时,因为代码写的不够完善,导致一些数据没有正确导入,在系统中重新导入所有基础数据又太麻烦,所以想到把没导入数据库的单独放入EXCEL中,通过PL\SQL导入到数据库中,并通过一个表的更新另一个表对应的。一、在oracle数据库中建立一个临时表,我的叫CELL_ANGLE,其表结构如图: 二、准备导入的数据,excel版本为2007,文件名为angle.xls,存... 无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于工作中经常出现,因此写篇文章记录一下多种写法。 先讲下我遇到的情况:  有一张表a,已经存在一个字段该字段是date类型,需求将该字段改为varchar2()类型,我们都知道, Oracle在该字段有值情况是不可以更新数据的,如果你不在乎该字段在表中位置变化的话,可以方法一操作: 方法一:新增一个字段,然后把原数据复制到这个下,然后把原字段删除,把新增的字段重命名。 如果不想改变位置但需要改变类型,请看下面: oracle支持快