接触了一个降本增效的项目,数据基本来自总账的各个科目,降的本、增的效的计算过程:会计根据当期账目,将数据填入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;
具体实现
语句如下

效果如下
