oracle的model子句让sql像excel一样灵活

接触了一个降本增效的项目,数据基本来自总账的各个科目,降的本、增的效的计算过程:会计根据当期账目,将数据填入Excel,设置好Excel公式后自动计算。sql能不能直接把Excel的计算过程给替换了?唉,你还真别说,Oracle提供了一个model子句,它还真能。

model子句可以让你将select查询出的rows作为多维数组,且能够随机访问该数组中的任意cell(即多维数组的构成元素,实质就是用一部分字段作为多维数组的下标索引,一部分字段作为数组的内容元素,这样就能实现类似Excel的灵活计算)。还可以指定若干单元格进行赋值,这被称为rules。

注意:当在查询中使用model子句时,select和order by子句必须只能使用那些在model子句中出现的column。

测试数据

测试数据如下,要计算一季度结束后,2025当年累计成本,相比去年同期,降低了多少。

字段包括:选厂factory、期间period、科目subject、成本cost

选厂:一选厂、二选厂

期间:2024-01、2024-02、2024-03、2025-01、2025-02、2025-03

科目:水、电

create table test (factory varchar2(100), period varchar2(7), subject varchar2(100), cost number);

insert into test(factory, period, subject, cost) values ('一选厂', '2024-01', '水',88 );

insert into test(factory, period, subject, cost) values ('一选厂', '2024-02', '水',87 );

insert into test(factory, period, subject, cost) values ('一选厂', '2024-03', '水',89 );

insert into test(factory, period, subject, cost) values ('一选厂', '2024-01', '电',99 );

insert into test(factory, period, subject, cost) values ('一选厂', '2024-02', '电',101 );

insert into test(factory, period, subject, cost) values ('一选厂', '2024-03', '电',98 );

insert into test(factory, period, subject, cost) values ('二选厂', '2024-01', '水',66 );

insert into test(factory, period, subject, cost) values ('二选厂', '2024-02', '水',67 );

insert into test(factory, period, subject, cost) values ('二选厂', '2024-03', '水',69 );

insert into test(factory, period, subject, cost) values ('二选厂', '2024-01', '电',77 );

insert into test(factory, period, subject, cost) values ('二选厂', '2024-02', '电',76 );

insert into test(factory, period, subject, cost) values ('二选厂', '2024-03', '电',78 );

insert into test(factory, period, subject, cost) values ('一选厂', '2025-01', '水',86 );

insert into test(factory, period, subject, cost) values ('一选厂', '2025-02', '水',87 );

insert into test(factory, period, subject, cost) values ('一选厂', '2025-03', '水',85 );

insert into test(factory, period, subject, cost) values ('一选厂', '2025-01', '电',99 );

insert into test(factory, period, subject, cost) values ('一选厂', '2025-02', '电',98 );

insert into test(factory, period, subject, cost) values ('一选厂', '2025-03', '电',96 );

insert into test(factory, period, subject, cost) values ('二选厂', '2025-01', '水',67 );

insert into test(factory, period, subject, cost) values ('二选厂', '2025-02', '水',65 );

insert into test(factory, period, subject, cost) values ('二选厂', '2025-03', '水',66 );

insert into test(factory, period, subject, cost) values ('二选厂', '2025-01', '电',75 );

insert into test(factory, period, subject, cost) values ('二选厂', '2025-02', '电',76 );

insert into test(factory, period, subject, cost) values ('二选厂', '2025-03', '电',74 );

commit;

具体实现

语句如下

效果如下

相关推荐
lllsure6 分钟前
【MySQL】数据分片
数据库·mysql
语落心生7 分钟前
深入doris查询计划以及io调度(五)列式存储结构 - 分析Segment格式、列数据编码
数据库
DBA小马哥9 分钟前
金仓数据库 vs 达梦:MySQL迁移谁更胜一筹?
数据库·mysql·金仓数据库·kes
Luna-player25 分钟前
那个在DG数据库中将多行指定字段的文本替换操作
数据库
それども28 分钟前
MySQL 执行计划中 filtered = 100 是什么意思
数据库·mysql
技术净胜40 分钟前
Python 连接 MySQL 数据库步骤
数据库·python·mysql
厦门辰迈智慧科技有限公司1 小时前
城市地下管网全域监测与安全防控整体解决方案
数据库·安全·物联网解决方案·地下管网监测·城市地下管网监测
小肖爱笑不爱笑1 小时前
JDBC Mybatis
数据库·mybatis
cookqq1 小时前
MySQL 5.7 大表删除部分数据:.ibd 文件会变小吗?磁盘会释放吗?
数据结构·数据库·mysql
IT 行者2 小时前
告别硬编码!Spring Boot 优雅实现 Controller 路径前缀统一管理
数据库·spring boot·python