`
datamachine
  • 浏览: 156833 次
社区版块
存档分类
最新评论

简化SQL式计算之逆分组

阅读更多

逆分组也是我们经常遇到的一种计算,即将每条记录拆成多条,实现分组汇总的逆运算。SQL可以实现这种算法,但必须转换思路绕个大弯才能实现,代码很复杂,也不易理解。

集算器实现这种逆分组较为容易,代码简单易懂,下面用一个例子来说明。

  表packGather记录着多种产品的包裹汇总数据,字段productID是产品编号,字段packing是包裹件数,每个包裹里的产品数量相同,字段quantitiySum产品总量。部分数据如下:



 

现在需要将表packGather拆分成包裹列表,即将多件包裹均分成单件包裹,并给每个包裹设定相对序号。以产品b为例,拆分后是3条记录:



 

集算器代码:



 

A1:从数据库取数。计算结果如下:



 

A2= A1.conj(packing.new(~:seq, productID:product, quantitiySum/packing:quan))

这句代码表示将A1中的每条记录拆成多条,形成二维表,每个二维表的记录数不同但结构相同,都有三个字段:seqproductquantity,最后将这些二维表纵向拼成一张大二维表。

函数conj的作用是拼合,比如单独拆分A1的第一条记录,代码和结果分别是:

 

A1(1).(packing.new( ~:seq,productID:product,quantitiySum/packing:quan))



 

 

A1.conj(…)等价于[A1(1),A1(2),A1(3)…].conj(…),最终结果如下:



 

注意表达式packing.new(…),这表示根据A1中每条记录的packing字段建立新序表。函数new可以根据已有的序列/序表创建新序表,比如["a","b","c"].new()[1,2,3…N].new(),后者可以简化成N.new()。比如第一条记录packing=2,则本表达式会被解析为[1,2].new(…)。用函数new建立新序表时,可以用符号“~”来表示原序列中的成员,因此表达式中的~:seq就表示将原序列作为新序表的第一个字段,字段名是seq

A2就是本案例的最终计算结果。

 

下面再看一个数据仓库中计算每日违约金额的例子,contract表有若干字段,其中合同编号、到期日、合同金额分别是:IDenddateamount,请计算到目前为止,违约的那些合同每天所需要交纳的违约金。假设每天所需交纳的违约金是合同金额的千分之一。

 

contract的部分数据如下:



 

集算器代码:



 

这段代码使用了函数periods来生成从合同到期日到当天的日期序列,#代表时间序列的当前序号。最终计算结果如下:



 

另外,集算器可被报表工具或java程序调用,调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。

 

  • 大小: 12.2 KB
  • 大小: 9.4 KB
  • 大小: 19.6 KB
  • 大小: 10.7 KB
  • 大小: 6.6 KB
  • 大小: 31.9 KB
  • 大小: 19.3 KB
  • 大小: 25.1 KB
  • 大小: 50.4 KB
0
0
分享到:
评论

相关推荐

    程序员的SQL金典.rar

    轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。  本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在...

    程序员的SQL金典4-8

     3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  3.1.4 主键对数据插入的影响  3.1.5 外键对数据插入的影响  3.2 数据的更新  3.2.1 简单的数据更新  3.2.2 带WHERE子句的UPDATE语句  3.2.3 非空...

    21天学会SQL

    9.2.4 根据现有列值计算新列值 174 9.2.5 命名新列 175 9.2.6 将查询结果保存为新表 176 9.2.7 连接字段 177 9.3 使用SELECT语句获取满足查询 条件的数据 178 9.3.1 指针与字段变量的概念 178 9.3.2 条件表达式 179 ...

    SQL数据库心得,分析得不错

    5、授权WIN NT分组和用户可存取SQL Server 6、为用非可信任连接的用户创建SQL Server登录帐号 二、为用户和角色分配登录帐号 三、给角色分配登录权 四、为用户和角色分配许可权限 在改进SQL Server 7.0系列所...

    程序员的SQL金典6-8

     3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  3.1.4 主键对数据插入的影响  3.1.5 外键对数据插入的影响  3.2 数据的更新  3.2.1 简单的数据更新  3.2.2 带WHERE子句的UPDATE语句  3.2.3 非空...

    程序员的SQL金典7-8

     3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  3.1.4 主键对数据插入的影响  3.1.5 外键对数据插入的影响  3.2 数据的更新  3.2.1 简单的数据更新  3.2.2 带WHERE子句的UPDATE语句  3.2.3 非空...

    程序员的SQL金典3-8

     3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  3.1.4 主键对数据插入的影响  3.1.5 外键对数据插入的影响  3.2 数据的更新  3.2.1 简单的数据更新  3.2.2 带WHERE子句的UPDATE语句  3.2.3 非空...

    SQL必知必会(第3版-PDF清晰版)part1

    推荐:学习SQL编程,必备书籍,从入门到进阶/精通,实例与理论同步,比较优秀作品!(共分压5部分)目录: 第1章 了解SQL... 1 1.1 数据库基础..... 1 1.1.1 什么是数据库..... 2 1.1.2 表..... 2 1.1.3 列和...

    2009达内SQL学习笔记

    计算次序可以通过圆括号()来明确地分组。不要过分依赖默认计算次序,使用圆括号()没有坏处,它能消除二义性。 and:条件与 如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price‘DELL’ ...

    T-SQL高级查询

    它是每一列计算指定的行聚合 b、 行聚合函数名称。包括sum、avg、min、max、count等 c、 要对其执行聚合函数的列 compute by适合做先分组后汇总的业务。compute by后面的列一定要是order by中出现的列。 3...

    SQL必知必会(第3版)--详细书签版

    本书涉及不同平台上数据的排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容,通过本书读者可以系统地学习到sql 的知识和方法。  本书注重实用性,操作性很强,适合于sql 的初学者学习...

    ORACLE数据库智能化管理系统2008演示

    18. 本系统可对执行SQL语句的结果集批量逐行处理某些字段值做为检索条件,从它表中取出想要的数据对相应的字段进行赋值计算,从而简化了SQL语句书写,提高了综合性能。 。。。。。。。 本系统以智能化语句书写及...

    ORACLE数据库智能化管理系统2012

    本系统可对执行SQL语句的结果集批量逐行处理多字段值一起做为检索条件,从它表中取出想要的多字段(值或计算结果)数据对相应的目标多字段进行赋值,从而简化了SQL语句书写难度,减少查询时间,提高了综合性能。...

    Sql查询,Access数据库在油田动态分析中的应用

    根据现场具体需求建立相应的Access数据库,利用Sql查询方法完成所有数据统计工作,实现分组、分类、分日期的动态数据统计计算。应用效果证明,该方法节省了科研工作人员70%的时间,简化了程序,工作效率提高2倍以上...

    LINQ 实战 1/11

    13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet...

    LINQ 实战 3/11

    13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet...

    LINQ 实战 4/11

    13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet...

    LINQ 实战 2/11

    13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet...

    LINQ 实战 7/11

    13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet...

    LINQ 实战 11/11

    13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet...

Global site tag (gtag.js) - Google Analytics