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

简化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 server 2012 reporting service 中制作分组折叠式报表

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

    Oracle9i的简化SQL语法

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

    SQL server2008数据库查询中的数据透视与数据逆透视.pdf

    SQL Server 2008 中数据透视(PIVOT)和数据逆透视(UNPIVOT)操作是用于转换表数据格式的SQL关系运算符。它们能够将行转换成列或将列转换成行,以便于进行数据分析和报告。 数据透视(PIVOT)操作允许我们把一个表...

    sqlserver数据统计一

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

    Transact-SQL参考(SQL Server 2000) 计算机专业电子书

    3. **存储过程**:了解如何定义和执行存储过程,这是一种预编译的Transact-SQL代码块,可提高性能并简化复杂的操作。 4. **触发器**:学习如何使用触发器来响应数据表中的插入、更新或删除事件,实现数据完整性和...

    泛微系统SQL语句大全

    利用SQL的`WHERE`子句进行条件筛选,`GROUP BY`进行分组统计,`HAVING`过滤分组结果,配合`CASE`表达式实现复杂的逻辑判断,满足多样化的业务需求。 5. **SQL Server特性**: - SQL Server提供了许多高级特性,如...

    SQL分组查询的教学探讨.pdf

    首先,SQL分组查询是数据库课程教学的重要组成部分,它涉及到对数据的整理和分析,是学生在学习数据库时难以掌握的内容之一。分组查询主要用于将数据集按某一列或多列的值进行分组,并可以对每个分组应用聚合函数,...

    SQL_reference.rar_SQL reference_reference sql

    2. **SQL查询**:SELECT语句的复杂性在于它的各种子句,如WHERE用于指定查询条件,GROUP BY用于数据分组,HAVING用于过滤分组后的结果,ORDER BY用于排序结果,以及JOIN操作用于合并来自多个表的数据。 3. **聚合...

    SQL基础、中级SQL、高级SQL_手册

    GROUP BY和HAVING子句用于对数据进行分组和过滤,便于聚合计算如SUM、COUNT、AVG和MAX。此外,你还将学习子查询,它可以在主查询内部执行,提供更灵活的数据筛选方式。 在高级SQL部分,将深入探讨窗口函数(Window ...

    T-SQL性能调优秘笈 基于SQL Server 2012窗口函数_PDF电子书

    - **窗口函数概述**:窗口函数(Window Function)是在SQL Server中处理复杂查询的一种强大工具,它可以用来执行分组内的计算,如排名、行号、累计总和等操作。 - **常见的窗口函数**: - `ROW_NUMBER()`:为每一行...

    21天迅速学会sql(比较完整的sql学习手册)

    - **背景**:SELECT是最常用的SQL语句之一,用于从数据库中检索特定的数据行或列。 - **一般的语法规则**:SELECT语句的基本格式是“SELECT column_name(s) FROM table_name WHERE condition;”,其中WHERE子句用于...

    高效SQL学习笔记

    4. 存储过程:预编译的SQL语句集合,可提高执行效率并简化代码。 四、SQL安全性 1. 权限管理:GRANT和REVOKE语句,用于赋予和撤销用户对数据库资源的访问权限。 2. 触发器:自动执行的程序,用于实现数据验证、...

    sql大全 sql大全

    查询技巧包括使用`WHERE`子句过滤结果,`GROUP BY`进行分组,`HAVING`对分组后的数据进行过滤,`ORDER BY`进行排序,`JOIN`连接多个表,`UNION`合并不同查询的结果,以及`DISTINCT`去除重复行。 存储过程是预编译的...

    Microsoft SQL Server 2008技术内幕:T-SQL查询_源代码及附录.zip

    SQL Server 2008引入了窗口函数,如RANK()、ROW_NUMBER()、LAG()和LEAD(),这些函数允许在数据集的行之间进行计算,而不局限于单行或固定的行集。 5. **存储过程和触发器**: T-SQL允许创建存储过程,这是一种预...

    SQLServer实用SQL语句大全

    在SQL Server数据库管理系统中,SQL(Structured Query Language)是用于管理关系数据库的主要工具。这个"SQLServer实用SQL语句大全"资源很可能包含了广泛且深入的SQL语法和实用技巧,适用于数据库设计、数据查询、...

    SQL集锦(好的SQL语句)

    6. **分组(GROUP BY)和聚合**:`GROUP BY` 语句用于将数据按一个或多个列进行分组,常与聚合函数一起使用,以对每个组进行统计。 7. **排序(ORDER BY)**:`ORDER BY` 用于根据一个或多个列对结果集进行升序...

    SQL CLR聚合函数在环境质量业务数据计算中的应用.pdf

    总结来说,SQL CLR聚合函数为处理复杂的环境质量数据提供了一种高效的解决方案,通过将.NET框架的计算能力与SQL Server的数据库功能相结合,不仅提高了数据处理的灵活性和性能,还大大简化了业务数据处理过程,为...

    oracle-plsql.zip_oracle_pl sql 分组查询_plsql_plsql 分组查询

    2. **分组查询**:在SQL中,GROUP BY语句用于根据一个或多个列对结果进行分组,常与聚合函数(如COUNT、SUM、AVG、MAX和MIN)一起使用,以便对每个分组执行统计计算。 3. **多表查询**:通过JOIN操作,可以从两个或...

    sql sever自学教程 pdf格式

    5. 存储过程和触发器:存储过程是预编译的SQL语句集合,可以提高性能并简化复杂的操作。触发器则是在特定数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行的程序,常用于实现业务规则和数据完整性。 6. 角色...

    sql即查即用资料

    可以使用WHERE子句进行条件筛选,GROUP BY进行数据分组,HAVING针对分组结果进行过滤,ORDER BY进行排序,LIMIT限制返回的记录数。 4. **插入与更新**:INSERT INTO用于向表中添加新记录,UPDATE则用于修改已存在的...

Global site tag (gtag.js) - Google Analytics