在数据库应用开发中,我们经常需要面对复杂的SQL式计算,行间计算就是其中一种,比如用每月的销售额除以上月的销售额,求比上期,或用每月销售额除以去年同月的销售额,求同期比。有些数据库没有提供SQL2003标准的窗口函数(或支持的不完备),完成行间计算就需要更换思路使用连接(join)运算替代,不仅难以理解而且运算效率低下。即使可以使用窗口函数仍要面临嵌套子查询等问题,SQL语句仍较为冗长。而使用集算器可以用更简单直观的代码来实现行间计算,下面用一个例子来说明。

表sales存储着多年的订单数据,请根据该表计算出指定时间段内各月份的销售额比上期和同期比。部分源数据如下:

集算器代码:

A1:按时间段从数据库查询数据,begin和end是外部参数,比如begin=”2011-01-01 00:00:00″,end=”2014-07-08 00:00:00″。部分查询结果如下:

A2=A1.groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):mAmount)
   这句代码对订单按照年份和月份进行分组,并汇总求得每月的销售额。函数groups可进行分组汇总运算,其参数分为两部分,分号之前是分组表达式,即:year(OrderDate):y,month(OrderDate):m,分号之后是汇总表达式,即sum(Amount):mAmount。汇总后的字段命名为mAmount。部分计算结果如下:

A3=A2.derive(mAmount/mAmount[-1]:lrr)

这句代码在A2基础上增加一个新的字段lrr,即按月比上期,其表达式为mAmount/mAmount[-1]。集算器可以用 [N]或[-N]来表达相对于当前记录之后的第N条记录,或之前的第N条记录,因此代码中mAmount代表当期销售额,mAmount[-1]代表上期销售额。计算结果如下:

需要注意的是,初始月份的比上期值为空(即2011年1月)。

A4=A3.sort(m)
   这句代码将A3按照月、年排序,以便计算同期比。完整的代码应当是:=A3.sort(m,y),由于A3本来就是按年排序的,因此只需按月排序就可以达到目的,即A3.sort(m),这样性能也高。部分计算结果如下:

A5=A4.derive(if(m==m[-1],mAmount/mAmount[-1],null):yoy)

这句代码在A4的基础上增加一个新的字段yoy,即月销售额的同期比,其表达式为if(m==m[-1],mAmount/mAmount[-1],null),这表示月份相同时才进行同期比计算。函数if有三个参数,其中m==m[1-]为布尔表达式,当该条件为True时,返回mAmount/mAmount[-1],当该条件为False时,返回null。需要注意的是,初始年份(即2011年)各月份的同期比衡为空。部分结果如下:

如果观察不便,可以加一行代码A6=A5.sort(y:-1,m),即将A5按照年逆序月正序进行排序。需要注意的是,数据只到2014年7月为止。结果如下:

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

简化SQL式计算之行间计算相关推荐

  1. sql显示前10行数据_SPL 简化 SQL 案例详解:计算各组前 N 行

    取出各组的前N行数据是较常见的运算,比如:每个月每种产品销量最高的五天是哪五天,每位员工涨薪最多的一次是哪次,高尔夫会员成绩最差的三次是哪三次,等等.在SQL中,这类运算要用窗口函数以及keep/to ...

  2. sql group by 取每组符合条件_SPL 简化 SQL 案例详解:计算各组前 N 行

    取出各组的前N行数据是较常见的运算,比如:每个月每种产品销量最高的五天是哪五天,每位员工涨薪最多的一次是哪次,高尔夫会员成绩最差的三次是哪三次,等等.在SQL中,这类运算要用窗口函数以及keep/to ...

  3. SQL 中的生成列/计算列以及主流数据库实现

    文章目录 什么是生成列? Oracle 中的虚拟列 MySQL 中的生成列 SQL Server 中的计算列 PostgreSQL 中的存储生成列 SQLite 中的生成列 什么是生成列? 在 SQL ...

  4. 逆波兰式的产生及计算(C++/Java)---编译原理

    逆波兰式的产生及计算(C++版及Java版本)-编译原理,数据结构 在现实生活中大家对于计算使用都是中缀表达式(nifix expression),如但是在计算机中表达式常常是以后缀表达式(postf ...

  5. 5. 数据库题(以个人熟悉数据库为准、按要求写出sql) (1) 计算每个人的总成绩并排名(要求显示字段:学号,姓名,总成绩) (2) 计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最

    5. 数据库题(以个人熟悉数据库为准.按要求写出sql) (1) 计算每个人的总成绩并排名(要求显示字段:学号,姓名,总成绩) (2) 计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高 ...

  6. 流式计算、实时计算和离线计算

    流式计算和批处理计算 实时计算和离线计算 以水为例,Hadoop可以看作是纯净水,一桶桶地搬:而Storm是用水管,预先接好(Topology),然后打开水龙头,水就源源不断地流出来了. 1.流式计算 ...

  7. SQL使用分组查询并计算条数

    sql分组查询使用COUNT计算每一组的条数并添加条件 SELECTf.jxlx,COUNT(*) AS 全部,COUNT( CASE WHEN ( f.zt = 1 ) THEN jxlx END ...

  8. 【3 - 查询】Sql Server - 郝斌(计算列、distinct、between、in、top、null、order by、模糊查询、聚合函数[主要是count()函数] )

    课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili ​ 目录 查询(最重要,难度最大) (一)大纲 (二)Scott 表 下载与导入SQ ...

  9. sql查询出的字段切割_SPL 简化 SQL 案例详解:多层固定分组

    在数据库应用开发中,我们经常需要面对各种复杂的SQL计算,多层固定分组就是其中一种.实现该算法的思路是用left join语句将源数据按照固定的依据对齐,但由于该算法往往涉及分组汇总.行间计算.填补缺 ...

最新文章

  1. 转载 Android 多线程处理之多线程用法大集合
  2. 卧槽!火爆github!超越YOLOv5,1.3M超轻量,高效易用,这个目标检测开源项目太香了!...
  3. 西湖大学鞠峰组招聘“污水处理”与“微生物组”方向博士后与科研助理
  4. 未来的信息安全管理人员应当具备哪些技能
  5. django使用postgresql时提示主键冲突
  6. 正在写一个VC的聊天软件
  7. CSP认证201809-1 卖菜[C++题解]:遍历
  8. centos mysql root_CentOS下MySQL忘记root密码解决方法
  9. sql导入excel数据失败_nifi入门从Excel数据导入ES开始
  10. argv、lambda、filter、map、reduce
  11. 空间说说秒赞java_人生靠反省,Java靠泛型
  12. 关于c++库文件的一点使用体会
  13. Collectors.toSet()
  14. 3个开源TTS(二)eSpeak的简要分析使用
  15. 从零实现加密隧道(二):socks5 协议详解
  16. python excel数据框_Python快速设置Excel表格边框
  17. 陕西勉县旅游策划方案——打造三国之都!
  18. mysql特殊字符转义_MYSQL特殊字符转义
  19. 路由器关闭DHCP之后连接不到路由器设置界面?
  20. 用阿里云短信服务--通过Web接口发送短信

热门文章

  1. 灾难恢复能力国家标准等级
  2. 还在对比IT培训机构,行内人告诉你怎么比?
  3. 死亡搁浅运送系统服务器,死亡搁浅图文攻略 主线流程+订单系统+运送流程+建筑搭建_操作介绍_游侠网...
  4. Java实现文件批量导入导出实例(兼容xls,xlsx)
  5. 单点登录涉及的技术点
  6. 问题解决:配置静态IP
  7. python爬取电影天堂beautiful_Python爬虫 -- 抓取电影天堂8分以上电影
  8. cocos2d-x ListView滚动与Button点击事件
  9. 怎么制作小怪兽打凹凸曼的游戏~
  10. IT:成为服务经纪人的未来