概述 利用 SQL MODEL 子句您可以根据查询结果定义多维数组然后将规则应用于该数组以计算新值这些规则可以是复杂的相互依赖的计算与外部解决方案相比通过将高级计算集 成到数据库中可以大幅度提升性能可伸缩性以及可管理性用户可以将数据保留在 Oracle 环境内而无需将数据复制到单独的应用程序或 PC 电子表格中 MODEL 子句通过将查询列映射到以下三组来定义多维数组分区列维度列和度量列这些元素执行以下任务 分区以类似于分析函数的分区方式(在数据仓库指南中标题为数据仓库中用于分析的 SQL的一章中有述)来定义结果集的逻辑块将 MODEL 规则应用于每分区的单元格 维度用于标识分区内的每个度量单元格这些列用于标识日期区域以及产品名之类的特征 度量类似于星型模式中事实表的度量它们通常包含数值例如销售单位或成本通过指定每个单元格的完整维度组合可以在单元格所处的分区内对其进行访问 要针对这些多维数组创建规则您需要定义以维度值形式表达的计算规则规则灵活且简洁并且可以使用通配符和 FOR 循环以最大限度地表达您的意图利用 MODEL 子句构建的计算通过将分析集成到数据库中改善了传统的电子表格计算通过符号引用提高了可读性并提供了可伸缩性和更好的可管理性 测试案例: 按月份得到quantity的累加值 SQL> with tmp as ( select Jan Month Quantity from dual union select Feb from dual union select Mar from dual union select Apr from dual union select May from dual ) select MonthQuantity_count from tmp model ignore nav /* &keep nav*/ partition by (X as x) dimension by (Month) measures (Quantity as Quantity_count) rules (Quantity_count[Jan]=Quantity_count[Jan] Quantity_count[Feb]=Quantity_count[Jan]+Quantity_count[Feb] Quantity_count[Mar]=Quantity_count[Feb]+Quantity_count[Mar] Quantity_count[Apr]=Quantity_count[Mar]+Quantity_count[Apr] Quantity_count[May]=Quantity_count[Apr]+Quantity_count[May] ) / MONTH QUANTITY_COUNT Apr Feb Jan Mar May SQL> 同样累加值也可以通过下面语句得到 SQL> SQL> with tmp as ( select Month Quantity from dual union select from dual union select from dual union select from dual union select from dual )select tmonthsum(tquantity) Quantity_count from tmp t left join tmp t on tmonth<=tmonth group by tmonth order by / MONTH QUANTITY_COUNT SQL> 其中指定ignore nav&keep nav处理NULL度量和缺失单元格 更多说明及案例请参考ORACLE官方说明 sqlmodel/ |