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

简化SQL式计算之多层固定分组

    博客分类:
  • DB
阅读更多

多层固定分组也是我们经常面对的一种复杂SQL式计算。实现该算法的核心思路是用left join语句将源数据按照固定的依据对齐,但由于该算法往往涉及分组汇总、行间计算、填补缺失数据,而且层次较多,因此相应的SQL语句会很复杂。

集算器可以实现多层固定分组,代码简单易懂,下面用一个例子来说明。

   表stocklog存储着每天多种货物的多次出入库记录,要计算出指定时间段内每天每种货物的库存状态。表stocklog的部分数据如下:



 

其中Indicator的值如果为空,则表示该记录是入库动作,如果为ISSUE,则表示出库。需要注意的是,这里的日期也许有缺失,即某几天完全没有出入库记录,但库存状态必须包含完整的连续日期。

库存状态是每天每种产品的开库时数量(Open)、入库数量(Enter)、最高库存(Total)、出库数量(Issued)、闭库时数量(Close)。其中:当日的“Open”等于前一日的“Close”,“Enter”和“Issued”来自于表stocklog,“Total”等于“Open+Enter”,“Close”等于“Open+Enter-Issued”或者是“Total-Issued”。

   集算器代码如下:



 

       A1:查询数据库,根据表stocklog计算出每种产品每天总的入库数量和出库数量。这里只需要对数据进行分组汇总,计算上没有难度,可以交给SQL语句去完成。值得注意的是,A1中有两个参数startend,分别对应SQL语句中的两个问号,这代表外部传入的时间段,可以来自于JAVA或报表工具。假设startend的值分别为2014-04-01”和“2014-04-10”,则A1的计算结果如下:



 

A2=A1.group(Lname)

   这句代码将A按照Lname分组,每组数据是一个产品每天的总出入库数量。值得注意的是,这里无需对分组后的数据进行汇总计算。A2的计算结果如下图左侧,右侧是每组数据的明细。



 

关于分组,集算器有两个函数:groupsgroup。函数groups类似于SQL中的group by语句,可以在分组的同时进行汇总。而group函数只分组,不做汇总,这是SQL缺乏的功能。

 

最终的计算结果需要startend之间每一天的库存状态,而源数据并非每天都有出入库记录,因此要把A2按照连续的时间序列对齐。下面先生成这个时间序列。

B2=periods(start,end,1)

函数periods可以生成时间序列,有三个参数:起始时间、终止时间、间隔。缺省将生成日期序列,使用选项还可以生成年、季、月、旬的时间序列。A3的计算结果如下:



 

A3=for A2,这是循环语句,表示对A2进行循环,每次计算一个产品。

B3-B6是循环体,具体算法是先将该产品的出入库记录与B2中的时间序列对齐,然后计算每个产品每天的库存状态,最后将计算结果追加到B6中。值得注意的是,集算器使用直观的缩进来表示循环体,而不是括号或begin/end等标识符。B3-B6就是循环语句A3的循环体。

 

B3=A3.align(A3,Date)

这句代码将当前产品的出入库记录与B2中的时间序列对齐。注意,A3既是循环语句,也是循环变量,即当前产品的出入库记录。以产品item3为例,下图左侧是对齐前的数据,右侧是对齐后的数据:



 

B4>c=0

这句代码用来给变量c赋初值0c代表当前产品每条库存状态的Open字段,初始日期的Open字段为0c会在B5中不断被修改。

 

B5=B3.new(A3.Lname:Lname,B2(#):LDate, c:Opening, Enter,(b=c+Enter):Total,Issue,(c=b-Issue):Close)

这句代码用来计算库存状态。B3.new(…)表示以B3为基础新建一个序表,即当前产品的库存状态。新序表中有7个字段,如下:

A3.Lname:Lname----从当前产品的出入库记录A3取出Lname字段,新字段名为Lname

B2 (#):LDate ----将时间序列B2按顺序插入新序表,作为新字段LDate。注意,#表示A3的记录序号,B2(N)表示B2的第N条记录,因此B2(#)表示按A3的序号将B2插入新序表。

c:Open----将变量c作为Open的字段值,第一条记录时,这个值为0

Enter----B3中的字段Enter直接当做新字段。由于新序表是基于B3的,因此无需像Lname字段那样重命名。

(b=c+Enter):Total----按公式Open+Enter计算出字段Total,为了清晰起见,这里用括号把表达式括起来。

Issue---B3中的字段Issue直接当做新字段。

(c=b-Issue):Close---按公式Total-Issued计算Close字段。注意,这里的c已经被修改了,在计算下一条记录时,c会作为Open字段的值,从而满足业务规则:当日的“Open”等于前一日的“Close”。

item3为例,B5的计算结果如下:



 

B6=@|B5

 

这句代码将B5不断地追加到当前格中,@表示当前格B6,最终计算结果如下:



 

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

 

 

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

 

  • 大小: 44.3 KB
  • 大小: 76.9 KB
  • 大小: 33.5 KB
  • 大小: 57.2 KB
  • 大小: 17.3 KB
  • 大小: 31.1 KB
  • 大小: 51.5 KB
  • 大小: 104.5 KB
0
0
分享到:
评论

相关推荐

    分组计算[按时间]通用[sql分组;C#分组]

    ### 分组计算:SQL与C#实现方法 在数据处理领域,分组计算是一项非常重要的技术,它能够帮助我们从大量的数据中提炼出有价值的信息。无论是使用SQL还是C#进行分组计算,目的都是为了更好地理解和分析数据。下面将...

    sql列数不固定查询语句

    在SQL查询中,有时会遇到数据表的列数不固定的情况,即数据表中的某些列可能存在或缺失,这通常发生在需要根据不同的条件对数据进行聚合或者分组的场景下。这种情况下,传统的SQL查询语句可能无法直接满足需求,需要...

    sqlserver 分组合并 分组统计

    sqlserver 分组合并字符串 分组统计数量

    sql server 2012 reporting service 中制作分组折叠式报表

    分组折叠式报表允许用户根据特定字段对数据进行分类,并可以展开或折叠这些分组以查看详细信息或简化视图。下面将详细介绍如何在SQL Server 2012 Reporting Services中实现这一功能。 首先,我们需要打开Reporting ...

    sql2000分组统计

    在SQL Server 2000中,分组统计是一个核心的查询功能,它允许数据库管理员和开发者对数据进行聚合操作,以获取特定字段的汇总信息。分组统计通常涉及GROUP BY语句,配合COUNT(), SUM(), AVG(), MAX() 和 MIN()等聚合...

    pb通过sql语句实现分组小计统计

    在IT行业中,数据库查询语言SQL(Structured Query Language)是数据管理与分析不可或缺的工具之一。在本文中,我们将深入探讨如何使用SQL语句实现分组小计统计,这是一个常见的需求,尤其是在数据分析、报表生成和...

    SQL Server分组排序取数据的实现

    在SQL Server中,分组和排序是数据处理的两个关键操作。它们可以帮助我们对大量数据进行聚合、组织和筛选,以便更好地分析和理解数据。本文将深入探讨如何在SQL Server中实现分组排序并获取每组的特定行数据。 首先...

    用SQL*FORMS实现多层弹出式窗口菜单的自动编程.pdf

    【SQL*FORMS实现多层弹出式窗口菜单的自动编程】 在Oracle数据库管理系统中,SQL*FORMS是一个强大的开发工具,它允许程序员创建交互式的数据库应用。然而,对于复杂的应用,如多层弹出式窗口菜单的实现,SQL*FORMS...

    分组汇总的sql

    用于分组汇总的sql语句,可根据某一列分组统计

    简化版SQL2000

    简化版SQL2000,使用方便,有用的人可以自由下载,我已经用了好几年了,请放心使用。

    Oracle9i的简化SQL语法

    3. **分析函数**:新增了窗口函数,如`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()`,允许在结果集中进行分组计算,而无需使用子查询或临时表。 4. **连接语法改进**:简化了连接操作,可以使用`JOIN`关键字直接指定...

    sql语句简化工具(jdk1.7版本可执行jar包)

    将格式化后的SQL贴入输入框,点击简化,即可获取简化为一行的SQL !!!!!!!!!!!!!!!!!!!

    sql server report server分组示例

    在SQL Server Report Server中,分组是数据呈现的重要方式,它允许用户以有意义的方式组织和汇总数据。在SQL Server 2005中,报告服务提供了强大的报告设计和分组功能,这使得开发者能够创建复杂的数据视图,帮助...

    sql server的表分组工具

    SQL Server的表分组工具是数据库管理中的一个重要概念,它主要应用于大型的SQL Server数据库环境中,帮助管理员有效地组织和管理大量的数据库表。这样的工具能够提高工作效率,使得数据库的架构更易于理解和维护。...

    计算两个时间相差多少年月日的sql算法

    在SQL中,计算两个日期之间的差值是一种常见的需求,特别是在涉及到日期跨度的业务逻辑处理时。本文将详细介绍如何使用SQL来实现计算两个日期相差多少年、月、日的方法,并通过具体的示例代码来帮助理解这一过程。 ...

    Sqlch11_2having条件分组查询.sql

    Sqlch11_2having条件分组查询.sql,Sqlch11_2having条件分组查询.sql Sqlch11_2having条件分组查询.sql,Sqlch11_2having条件分组查询.sql

    一种基于LINQ防范SQL注入攻击的多层体系结构.pdf

    在这份文档中,徐海涛和孙丹凤两位作者主要探讨了SQL注入攻击的原理、现有防范方法,以及一种基于LINQ的多层体系结构来防范SQL注入攻击的方案。以下是对文中提及知识点的详细阐述: 1. SQL注入攻击原理 SQL注入是一...

    用SQL实现统计报表中的小计与合计的方法详解

    这种方法通过创建临时表、分配唯一标识符、遍历分组并计算总计,以及最后的合并展示,有效地实现了报表的生成。如果需要优化,可以考虑进一步调整代码以减少内存消耗,或者考虑使用其他方法,如GROUPING SETS或...

    第22讲 SQL语言高级05--分组统计函数.PPT

    SQL语言的高级部分,特别是关于分组统计函数的使用,是数据库查询中极其重要的一个环节。在本讲中,我们将深入探讨如何利用这些函数来处理和汇总数据。 首先,我们要了解什么是分组函数。分组函数是作用于一组行,...

    sqlserver数据统计一

    在SQL Server中,我们可以使用Transact-SQL(T-SQL)编写源代码来执行数据统计任务,例如使用GROUP BY语句进行分组统计,使用COUNT、SUM、AVG、MAX、MIN等聚合函数对数据进行计算。此外,可能还会提及SQL Server ...

Global site tag (gtag.js) - Google Analytics