扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 来源:开发者在线 2007年8月15日
关键字: Bob Watkins SQL ORACLE
在本页阅读全文(共3页)
电子数据表常常被当作关系表的例子。它的行和列与数据库表格中的行和列类似。每个行和列交叉的地方是值。
二者的不同之处在于:在电子数据表里,每个单元格可以包含一个函数,用来计算该单元格的值。每个单元格里的函数可以完全不同;而关系表里只能保存值。你可以在查询里使用计算,但是这些计算会应用到查询的每一行里。
从Oracle 10g开始,你可以把查询的输出结果当作电子表格来处理,对输出的每个单元格进行单独的计算。你甚至可以在输出里生成原有表格里没有的行。SELECT语句的MODEL子句会定义哪些列用来聚合(度量单位)、哪些行用作唯一的数组索引(维),以及哪些函数用来计算值(规则)。
列表A里的查询用订单登录(Order Entry,OE)示例架构计算出了一个小计。在检查输出结果的时候,我发现1998年之前销售额相对较小,所以想把它计入1998年的总额,而不再报告中显示出来。列表B利用了MODEL子句来实现这一目的。
DIMENSION BY用来定义哪些列用作虚拟电子表格里的索引。有两种:order_mode(在线或者直接)以及order_year。MEASURES用来定义哪个列为单元格提供值。在本文里,它是order_total,我把它简写为“tot”。
RETURN UPDATED ROWS用来删除我们的规则不会更新的所有行——这是删除1998年之前内容的一种方式。
RULES列表用来定义如何计算单元格。我们的模型有两个规则:
Tot[ANY, 1998] = SUM(tot)[CV(order_mode),order_year <=1998]
Tot[ANY, order_year>1998] = tot[CV(order_mode), CV(order_year)]
第一个规则是:对于1998年,把包括1998年在内的所有年份的小计加在一起,得到总计。ANY这个关键字在一个规则里就完成了两种订单模式的计算。第二个规则是:对于1998年之后的年份,就使用现有的总计(当前值,简写作CV,被用于所有的订单模式和所有年份)。
通过这些规则,你可以在任何时候访问到查询里的所有行,方法是找对与数组单元格唯一对应的指数组合就行了。它的一些应用如:
虽然这里列出的Oracle几个例子只用到了二维,但是SQL模型可能会复杂得多。MODEL子句有很多用于计算数据的选项,我们这里就不一一列举了。要获得更多关于MODEL的信息,请参看《Oracle数据库数据仓指南》的第22章——《SQL的建模》。
Bob Watkins(OCP、MCDBA、MCSE、MCT)具有从事技术培训师、咨询师和数据库管理员的25年计算机职业经验。他是位于达拉斯/沃尔斯堡地区提供数据库咨询和培训服务的B. Watkins公司的高级咨询师兼合伙人。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者