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

简化SQL计算之固定分组

    博客分类:
  • DB
阅读更多

固定分组的分组依据不在待分组的数据中,而是来自于外部,比如另一张表、外部参数、条件列表。对于特定类型的固定分组,用SQL实现还算简单,比如:分组依据来自另一张表,且对分组次序没有要求,但要实现其他情况就困难了。

集算器可以轻松解决固定分组中的各类难题,下面用几个例子来说明。

sales存储着订单记录,其中CLIENT列是客户名,AMOUNT列是订单金额,请将sales按照“潜力客户列表”进行分组,并对各组的AMOUNT列汇总求和。表sales的部分数据如下:



 

案例一:潜力客户列表来自于另外一张表potentialStd字段,只有四条记录,依次为:TASDSGCGCZTOZ并且客户ZTOZ不在sales表中。本案例要求按照上述记录顺序来分组汇总。

假如我们对分组的顺序没有要求,那么SQL可以较简单地实现本案例,代码形如:

select potential.std as client, sum(sales.amount) as amount from potential left join client on potential.std=sales.client group by potential.std

 

但本案例要求按照特定的顺序来分组,要实现这种算法,用SQL就必须制造一个用于排序的字段,最后还要用子查询去掉这个字段。而用集算器实现本案例会简单很多,代码如下:



 

A1B1:从数据库检索数据,分别命名为salespotential,如下所示:



 

A3=sales.align@a(potential:Std,Client)

 

这句代码使用了函数align,它将salesClient字段按照potentailStd字段分为四个组,如下:



 

可以看到,前三个组是sales中已有的数据,而第四个组不在sales中,因此是空值。另外,函数align的参数选项@a表示取出分组中的所有数据,如果不用这个函数选项,则只取每组的第一条。

 

A4=pjoin(potential.(Std),A3.(~.sum(Amount)))

 

这句代码用函数pjoin将两部分数据进行横向合并,一部分是potential.(Std),这表示potentialStd字段;另一部分是A3.(~.sum(Amount)),这表示对A3中每组数据的Amount字段求和。本案例的最终结果如下:



 

案例二:潜力客户列表是固定值,但客户的数量较多。

 

如果客户的数量较少,用SQL时可以用union语句将所有的客户拼成一个假表,如果客户数量较多,这么做就可不取了,必须新建一张表持久保存数据才行。用集算器实现可以省去建表的麻烦,代码如下:



 

上述代码中,A2是个逗号分隔的字符串,可以轻松表达大量的固定值。

 

案例三:潜力客户列表是外部参数,形如:TAS,BON,CHO,ZTOZ

外部参数经常变化,在SQL中用union来制造假表就很不方便了,只能创建一个临时表,将参数解析后一条条插入临时表,再进行后续的计算。而用集算器实现本案例不必建立临时表,实现过程如下:

 

首先定义一个参数arg1



 

然后修改脚本文件,如下:



 

运行脚本,并输入的参数值,假设参数值为"TAS,BON,CHO,ZTOZ",如下:



 

由于分组依据和案例一相同,因此最终的计算结果也一样。

注意,A2中的代码可以将字符串"TAS,BON,CHO,ZTOZ"转变成序列["TAS","DSGC","GC","ZTOZ"]。如果输入参数直接就是["TAS","DSGC","GC","ZTOZ"],则可以省略这个转换的步骤。

 

案例四:固定分组的分组依据可以是数值,也可以是条件,比如:将订单金额按照100020004000划分为四个区间,每个区间一组订单,统计各组订单的总额。

 

如果条件是已知,那就可以将这些条件写死在SQL里,如果条件是动态的外部参数,则需要用JAVA等高级语言拼凑SQL,过程非常复杂。集算器支持动态表达式,代码如下:



 

 

上述代码中,变量byFac是本案例的分组依据,包含四个字符串条件。byFac也可以是外部参数,或者来自于数据库中的视图或表。A4中的最终结果如下:



 

案例五:

         上述条件分组中,条件恰好没有发生重叠,但实际上发生重叠的情况很常见,比如将订单金额按照如下规则分组:

         10004000:常规订单r14

         2000以下:非重点订单r2

         3000以上:重点订单r3

这时,r2r3都会和r14发生条件重叠。条件发生重叠时,我们有时希望数据不重叠,即先取出符合r14的数据,再从剩下的数据中筛选出r2,以此类推。

 

集算器的函数enum支持数据重叠的条件分组,如下:



 

A3中的分组结果如下:



 

计算结果如下:



 

有时我们希望分组结果中包含重叠数据,即先从sales中取出符合r14的数据,再从完整的sales中取出符合r2的数据,以此类推。此时,只需要在函数enum中使用函数选项@r,即将A3中的代码改为:=sales.enum@r(byFac,Amount),此时分组结果如下:



 

图中红框里的数据是重复的。最后的计算结果如下:



 

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

  • 大小: 47.7 KB
  • 大小: 36.2 KB
  • 大小: 25.2 KB
  • 大小: 63.7 KB
  • 大小: 9.8 KB
  • 大小: 29.5 KB
  • 大小: 30.3 KB
  • 大小: 18.9 KB
  • 大小: 18.3 KB
  • 大小: 27.1 KB
  • 大小: 18.5 KB
  • 大小: 26.7 KB
  • 大小: 92.3 KB
  • 大小: 11.9 KB
  • 大小: 86.4 KB
  • 大小: 12.4 KB
0
0
分享到:
评论

相关推荐

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

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

    通过分析SQL语句的执行计划优化SQL

    6. **物化视图**:对于固定查询模式,可以创建物化视图预先计算结果,加速查询。 五、使用Oracle的优化工具 Oracle提供了一些内置工具,如`SQL Tuning Advisor`和`Automatic Workload Repository (AWR)`,它们可以...

    GBase 8a SQL参考手册

    存储过程和函数是预编译的SQL代码集合,可以提高性能并简化复杂操作。手册将详细介绍创建、调用和管理存储过程和自定义函数的语法和限制。 **附录:SQL保留字** 列出GBase 8a中的SQL保留字,帮助开发者避免在编写...

    SQL server 2000自学教程

    2. 角色管理:使用固定服务器角色和固定数据库角色简化权限管理。 3. 权限控制:GRANT、DENY、REVOKE命令用于授予、拒绝和撤销访问权限。 4. 触发器:创建触发器实现数据更改时的自动响应和规则检查。 七、备份与...

    关系数据库SQL语言.rar

    关系型数据库基于关系模型,其中数据以表格的形式存储,每个表格有固定的列(字段)和行(记录),并可通过主键和外键实现表之间的关联。 2. SQL基本语法:SQL语句通常分为DQL(数据查询语言)、DDL(数据定义语言...

    SQL语法大全中文版

    SQL(Structured Query Language)是用于管理和操作关系数据库的标准语言,其语法丰富多样,适用于数据查询、更新、插入和删除等操作。"SQL语法大全中文版" 提供了全面的SQL语法规则,帮助用户深入理解和掌握这个...

    SQL学习总结

    - **CHAR**: 固定长度字符串类型。 - **VARCHAR**: 可变长度字符串类型。 - **TEXT**: 存储较长的字符串文本。 **4. 示例** - 创建一个包含不同字符类型的表: ```sql CREATE TABLE characters ( id INT ...

    新手常用SQL语句

    1. **窗口函数(Window Functions)**: 如RANK(), ROW_NUMBER(), LAG()和LEAD(),在分组后进行排序和计算。 2. **自连接(Self Join)**: 表自身与其自身的连接,用于处理复杂的关系。 3. **子查询优化(Subquery ...

    使用 SQLServer1到3章

    在“使用SQL Server管理和查询数据(SQL Base)1~~~~~~3章”这个压缩包中,包含了有关SQL Server数据库管理系统的基础知识,特别关注了SQL语言的基本应用。SQL(Structured Query Language)是一种用于管理关系数据库...

    SQL自学通

    SQL(Structured Query Language)是用于管理和操作关系数据库的标准语言,它是数据分析师、数据库管理员和程序员必备的技能之一。"SQL自学通"这个资料很可能是为了帮助初学者掌握SQL的基础知识和高级技巧而设计的。...

    2009达内SQL学习笔记

    计算次序可以通过圆括号()来明确地分组。不要过分依赖默认计算次序,使用圆括号()没有坏处,它能消除二义性。 and:条件与 如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price‘DELL’ ...

    SQL语句教程

    SQL语句通常遵循固定的语法结构,包括子句、条件和运算符。 2. SELECT查询: - `SELECT`语句是最常用的部分,用于从表中提取数据。你可以选择指定的列,例如`SELECT column1, column2 FROM table;` - 使用`WHERE`...

    高性能:有哪些常见的 SQL 优化手段?

    1. 减少JOIN数量:过多的JOIN会增加计算复杂性,尽量简化查询逻辑。 2. 优化JOIN顺序:根据数据量和关联列的索引情况,调整JOIN顺序。 3. 使用INNER JOIN代替OUTER JOIN:INNER JOIN通常更快,除非确实需要所有记录...

    使用over函数实现递归汇总计算

    - **固定行数范围**:`OVER (ORDER BY salary ROWS BETWEEN 50 PRECEDING AND 150 FOLLOWING)` 表示当前行之前的 50 行和之后的 150 行作为计算窗口。 - **值范围**:`OVER (ORDER BY salary RANGE BETWEEN 50 ...

    Dynamic-SQL-Pivot-Table:存储过程为使用动态SQL开发数据透视表提供了简化的结构

    在SQL Server中,静态SQL通常用于创建固定列的数据透视表,但当列名或数量需要根据输入参数或查询结果动态改变时,就需要用到动态SQL。 T-SQL中的动态SQL通常包括以下几个步骤: 1. 定义变量:首先,我们需要定义...

    SQL操作题(1).zip

    - 字符串型:CHAR(固定长度字符串)、VARCHAR(可变长度字符串)等。 - 日期/时间型:DATE、TIME、DATETIME、TIMESTAMP等。 - 其他:BOOLEAN(布尔型)、BLOB(二进制大对象)、TEXT(文本)等。 4. 聚合函数与...

    SQL入门教程

    - **运算次序**:在SQL中,可以使用圆括号来控制表达式的运算顺序,确保正确的数学计算。 - **使用表达式来计算值**:通过`SELECT`语句中的算术表达式,可以在查询结果中计算新的值。 - **给表达式命名**:使用`AS...

Global site tag (gtag.js) - Google Analytics