oracle的model子句让sql像excel一样灵活
2026/4/23 8:02:57 网站建设 项目流程

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

具体实现

语句如下

效果如下

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询