多层固定分组也是我们经常面对的一种复杂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中有两个参数start和end,分别对应SQL语句中的两个问号,这代表外部传入的时间段,可以来自于JAVA或报表工具。假设start和end的值分别为“2014-04-01”和“2014-04-10”,则A1的计算结果如下:
A2=A1.group(Lname)
这句代码将A按照Lname分组,每组数据是一个产品每天的总出入库数量。值得注意的是,这里无需对分组后的数据进行汇总计算。A2的计算结果如下图左侧,右侧是每组数据的明细。
关于分组,集算器有两个函数:groups和group。函数groups类似于SQL中的group by语句,可以在分组的同时进行汇总。而group函数只分组,不做汇总,这是SQL缺乏的功能。
最终的计算结果需要start到end之间每一天的库存状态,而源数据并非每天都有出入库记录,因此要把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赋初值0。c代表当前产品每条库存状态的Open字段,初始日期的Open字段为0,c会在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形式的计算结果,具体方法可参考相关文档。
相关推荐
### 分组计算:SQL与C#实现方法 在数据处理领域,分组计算是一项非常重要的技术,它能够帮助我们从大量的数据中提炼出有价值的信息。无论是使用SQL还是C#进行分组计算,目的都是为了更好地理解和分析数据。下面将...
在SQL查询中,有时会遇到数据表的列数不固定的情况,即数据表中的某些列可能存在或缺失,这通常发生在需要根据不同的条件对数据进行聚合或者分组的场景下。这种情况下,传统的SQL查询语句可能无法直接满足需求,需要...
sqlserver 分组合并字符串 分组统计数量
分组折叠式报表允许用户根据特定字段对数据进行分类,并可以展开或折叠这些分组以查看详细信息或简化视图。下面将详细介绍如何在SQL Server 2012 Reporting Services中实现这一功能。 首先,我们需要打开Reporting ...
在SQL Server 2000中,分组统计是一个核心的查询功能,它允许数据库管理员和开发者对数据进行聚合操作,以获取特定字段的汇总信息。分组统计通常涉及GROUP BY语句,配合COUNT(), SUM(), AVG(), MAX() 和 MIN()等聚合...
在IT行业中,数据库查询语言SQL(Structured Query Language)是数据管理与分析不可或缺的工具之一。在本文中,我们将深入探讨如何使用SQL语句实现分组小计统计,这是一个常见的需求,尤其是在数据分析、报表生成和...
在SQL Server中,分组和排序是数据处理的两个关键操作。它们可以帮助我们对大量数据进行聚合、组织和筛选,以便更好地分析和理解数据。本文将深入探讨如何在SQL Server中实现分组排序并获取每组的特定行数据。 首先...
【SQL*FORMS实现多层弹出式窗口菜单的自动编程】 在Oracle数据库管理系统中,SQL*FORMS是一个强大的开发工具,它允许程序员创建交互式的数据库应用。然而,对于复杂的应用,如多层弹出式窗口菜单的实现,SQL*FORMS...
用于分组汇总的sql语句,可根据某一列分组统计
简化版SQL2000,使用方便,有用的人可以自由下载,我已经用了好几年了,请放心使用。
3. **分析函数**:新增了窗口函数,如`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()`,允许在结果集中进行分组计算,而无需使用子查询或临时表。 4. **连接语法改进**:简化了连接操作,可以使用`JOIN`关键字直接指定...
将格式化后的SQL贴入输入框,点击简化,即可获取简化为一行的SQL !!!!!!!!!!!!!!!!!!!
在SQL Server Report Server中,分组是数据呈现的重要方式,它允许用户以有意义的方式组织和汇总数据。在SQL Server 2005中,报告服务提供了强大的报告设计和分组功能,这使得开发者能够创建复杂的数据视图,帮助...
SQL Server的表分组工具是数据库管理中的一个重要概念,它主要应用于大型的SQL Server数据库环境中,帮助管理员有效地组织和管理大量的数据库表。这样的工具能够提高工作效率,使得数据库的架构更易于理解和维护。...
在SQL中,计算两个日期之间的差值是一种常见的需求,特别是在涉及到日期跨度的业务逻辑处理时。本文将详细介绍如何使用SQL来实现计算两个日期相差多少年、月、日的方法,并通过具体的示例代码来帮助理解这一过程。 ...
Sqlch11_2having条件分组查询.sql,Sqlch11_2having条件分组查询.sql Sqlch11_2having条件分组查询.sql,Sqlch11_2having条件分组查询.sql
在这份文档中,徐海涛和孙丹凤两位作者主要探讨了SQL注入攻击的原理、现有防范方法,以及一种基于LINQ的多层体系结构来防范SQL注入攻击的方案。以下是对文中提及知识点的详细阐述: 1. SQL注入攻击原理 SQL注入是一...
这种方法通过创建临时表、分配唯一标识符、遍历分组并计算总计,以及最后的合并展示,有效地实现了报表的生成。如果需要优化,可以考虑进一步调整代码以减少内存消耗,或者考虑使用其他方法,如GROUPING SETS或...
此外,文档还提到了数据类型,例如NCHAR,它是一种固定长度的字符数据类型,在SQL Server中用于存储Unicode字符数据。 最后,文档提及了学生成绩信息管理系统数据库的四个基本表的设计,这包括学生信息表、课程信息...
总的来说,“Web平台上使用LINQ to SQL创建三层多层Web应用系统”这个教程将引导你学习如何在Web环境中构建高效、可扩展的应用,通过使用LINQ to SQL简化数据库操作,并结合三层架构实现良好的模块化和解耦。...