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支持快