逆分组也是我们经常遇到的一种计算,即将每条记录拆成多条,实现分组汇总的逆运算。SQL可以实现这种算法,但必须转换思路绕个大弯才能实现,代码很复杂,也不易理解。
集算器实现这种逆分组较为容易,代码简单易懂,下面用一个例子来说明。
表packGather记录着多种产品的包裹汇总数据,字段productID是产品编号,字段packing是包裹件数,每个包裹里的产品数量相同,字段quantitiySum是产品总量。部分数据如下:
现在需要将表packGather拆分成包裹列表,即将多件包裹均分成单件包裹,并给每个包裹设定相对序号。以产品b为例,拆分后是3条记录:
集算器代码:
A1:从数据库取数。计算结果如下:
A2= A1.conj(packing.new(~:seq, productID:product, quantitiySum/packing:quan))
这句代码表示将A1中的每条记录拆成多条,形成二维表,每个二维表的记录数不同但结构相同,都有三个字段:seq、product、quantity,最后将这些二维表纵向拼成一张大二维表。
函数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表有若干字段,其中合同编号、到期日、合同金额分别是:ID、enddate、amount,请计算到目前为止,违约的那些合同每天所需要交纳的违约金。假设每天所需交纳的违约金是合同金额的千分之一。
表contract的部分数据如下:
集算器代码:
这段代码使用了函数periods来生成从合同到期日到当天的日期序列,#代表时间序列的当前序号。最终计算结果如下:
另外,集算器可被报表工具或java程序调用,调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。
相关推荐
分组折叠式报表允许用户根据特定字段对数据进行分类,并可以展开或折叠这些分组以查看详细信息或简化视图。下面将详细介绍如何在SQL Server 2012 Reporting Services中实现这一功能。 首先,我们需要打开Reporting ...
3. **分析函数**:新增了窗口函数,如`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()`,允许在结果集中进行分组计算,而无需使用子查询或临时表。 4. **连接语法改进**:简化了连接操作,可以使用`JOIN`关键字直接指定...
SQL Server 2008 中数据透视(PIVOT)和数据逆透视(UNPIVOT)操作是用于转换表数据格式的SQL关系运算符。它们能够将行转换成列或将列转换成行,以便于进行数据分析和报告。 数据透视(PIVOT)操作允许我们把一个表...
在SQL Server中,我们可以使用Transact-SQL(T-SQL)编写源代码来执行数据统计任务,例如使用GROUP BY语句进行分组统计,使用COUNT、SUM、AVG、MAX、MIN等聚合函数对数据进行计算。此外,可能还会提及SQL Server ...
3. **存储过程**:了解如何定义和执行存储过程,这是一种预编译的Transact-SQL代码块,可提高性能并简化复杂的操作。 4. **触发器**:学习如何使用触发器来响应数据表中的插入、更新或删除事件,实现数据完整性和...
利用SQL的`WHERE`子句进行条件筛选,`GROUP BY`进行分组统计,`HAVING`过滤分组结果,配合`CASE`表达式实现复杂的逻辑判断,满足多样化的业务需求。 5. **SQL Server特性**: - SQL Server提供了许多高级特性,如...
首先,SQL分组查询是数据库课程教学的重要组成部分,它涉及到对数据的整理和分析,是学生在学习数据库时难以掌握的内容之一。分组查询主要用于将数据集按某一列或多列的值进行分组,并可以对每个分组应用聚合函数,...
2. **SQL查询**:SELECT语句的复杂性在于它的各种子句,如WHERE用于指定查询条件,GROUP BY用于数据分组,HAVING用于过滤分组后的结果,ORDER BY用于排序结果,以及JOIN操作用于合并来自多个表的数据。 3. **聚合...
GROUP BY和HAVING子句用于对数据进行分组和过滤,便于聚合计算如SUM、COUNT、AVG和MAX。此外,你还将学习子查询,它可以在主查询内部执行,提供更灵活的数据筛选方式。 在高级SQL部分,将深入探讨窗口函数(Window ...
- **窗口函数概述**:窗口函数(Window Function)是在SQL Server中处理复杂查询的一种强大工具,它可以用来执行分组内的计算,如排名、行号、累计总和等操作。 - **常见的窗口函数**: - `ROW_NUMBER()`:为每一行...
- **背景**:SELECT是最常用的SQL语句之一,用于从数据库中检索特定的数据行或列。 - **一般的语法规则**:SELECT语句的基本格式是“SELECT column_name(s) FROM table_name WHERE condition;”,其中WHERE子句用于...
4. 存储过程:预编译的SQL语句集合,可提高执行效率并简化代码。 四、SQL安全性 1. 权限管理:GRANT和REVOKE语句,用于赋予和撤销用户对数据库资源的访问权限。 2. 触发器:自动执行的程序,用于实现数据验证、...
查询技巧包括使用`WHERE`子句过滤结果,`GROUP BY`进行分组,`HAVING`对分组后的数据进行过滤,`ORDER BY`进行排序,`JOIN`连接多个表,`UNION`合并不同查询的结果,以及`DISTINCT`去除重复行。 存储过程是预编译的...
SQL Server 2008引入了窗口函数,如RANK()、ROW_NUMBER()、LAG()和LEAD(),这些函数允许在数据集的行之间进行计算,而不局限于单行或固定的行集。 5. **存储过程和触发器**: T-SQL允许创建存储过程,这是一种预...
在SQL Server数据库管理系统中,SQL(Structured Query Language)是用于管理关系数据库的主要工具。这个"SQLServer实用SQL语句大全"资源很可能包含了广泛且深入的SQL语法和实用技巧,适用于数据库设计、数据查询、...
6. **分组(GROUP BY)和聚合**:`GROUP BY` 语句用于将数据按一个或多个列进行分组,常与聚合函数一起使用,以对每个组进行统计。 7. **排序(ORDER BY)**:`ORDER BY` 用于根据一个或多个列对结果集进行升序...
总结来说,SQL CLR聚合函数为处理复杂的环境质量数据提供了一种高效的解决方案,通过将.NET框架的计算能力与SQL Server的数据库功能相结合,不仅提高了数据处理的灵活性和性能,还大大简化了业务数据处理过程,为...
2. **分组查询**:在SQL中,GROUP BY语句用于根据一个或多个列对结果进行分组,常与聚合函数(如COUNT、SUM、AVG、MAX和MIN)一起使用,以便对每个分组执行统计计算。 3. **多表查询**:通过JOIN操作,可以从两个或...
5. 存储过程和触发器:存储过程是预编译的SQL语句集合,可以提高性能并简化复杂的操作。触发器则是在特定数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行的程序,常用于实现业务规则和数据完整性。 6. 角色...
可以使用WHERE子句进行条件筛选,GROUP BY进行数据分组,HAVING针对分组结果进行过滤,ORDER BY进行排序,LIMIT限制返回的记录数。 4. **插入与更新**:INSERT INTO用于向表中添加新记录,UPDATE则用于修改已存在的...