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

集算器实现SQL动态列计算的示例

    博客分类:
  • DB
阅读更多

       被数据库厂商扩展后的SQL也可动态拼接出语句执行,但SQL的集合运算和有序计算不方便,实现动态列计算很繁琐,往往要借助高级语言拼出动态SQL

       免费的集算器支持动态脚本、有序计算、显式集合,可以弥补这一不足。下面举例说明SQL开发中常见的动态列计算问题,以及集算器对应的解法。

列间排序

 

       order6个整数类型的字段,现在要对每条记录的字段值进行排序,使其按从小到大的顺序横向排列。源数据如下:

 

       集算器代码:



 

       先执行SQL,再循环处理每条记录,处理过程为:将当前记录的字段值用函数array转为集合,再用sort函数排序,最后用函数record写入当前记录。结果如下:



动态拼Merge语句

 

         参数sourcetarget代表MSSQL中两个结构相同但数据不同的表,要求以主键为标准用source更新target,比如table1table2的主键都是AB,数据如下:



         table2更新table1时,应当动态生成如下的MERGE语句:

       MERGE INTO table1 as t

       USING table2 as s

       ON t.A=s.A and t.B=s.B

       WHEN MATCHED

       THEN UPDATE SET t.C=s.C,t.D=s.D

       WHEN NOT MATCHED

       THEN INSERT VALUES(s.A,s.B,s.C,s.D)

 

         更新后的table1应当如下:



       集算器代码:



         从系统表读出source的主键和字段,分别存在变量pkscolumns中,之后用循环函数pks.(…)动态生成merge语句,其中~表示循环变量,#表示循环计数。

         上述代码只是生成merge语句,可将该语句返回给JAVA执行,也可以在集算器中执行,代码即:A6=myDB1.excute(A5) 。

 

跨库动态merge运算

 

         前面的例子假设sourcetarget在同一个数据库,但如果两者分属不同的数据库(比如MSSQLOracle),则无法拼出相应的merge语句,此时可用集算器实现merge计算。代码如下:



       myDB2/myDB1分别指向source/target所在数据库,A3\A4以游标的形式打开数据库,使用join@x1函数对游标进行左连接,之后每次从A5取一批数据到内存,使用update函数更新target,其中@i表示只生成insert语句,@u表示只生成update语句。执行后target如下:


 

         这个方法也可以应用于那些不支持MERGE语句的数据库,如MySQL

字段含表名的动态SQL

 

         A有两个字段:IDTableNameTableName存储其他表的表名,比如BCD等,这些表结构相同,都以ID为关键字。表AID字段存储其他表的ID。源数据如下:



         现在要通过表A获得其他表的相关记录,即:



 

       集算器代码:



 

         查询表A并按TableName分组,之后循环每组数据,动态取得其他表中对应的记录,最后合并记录并按ID排序,结果如下:



 

         如果表A本身无序,但计算结果要和表A保持同序,则应当使用下面的代码:A1.(mssql.query("select ID,Num from "+TableName+" where ID =?",ID)).conj()

动态跨列统计

 

         tb字段数未知,但所有字段类型相同,现在要统计所有记录的所有字段有多少种不同的数据,每种数据各有几个。源数据如下:



 

         集算器代码:



 

         先将每条记录的每个字段合并为一个大集合,再进行分组汇总,结果如下:



 

两记录比较不同

 

         Burger存储着对汉堡包两次检测后的成分含量,现在要比较这两条记录,列出不同的成分。源数据如下:



 

         集算器代码:



 

         A2\A3分别将两条记录转为集合,再用pselect函数找到A2\A3不同成员的序号列表,最后按字段序号创建新二维表。结果如下:



 

         如果源数据有多组数据,每组都有两条,比较的结果需要拼成name\fieldname\value三个字段,则应当使用如下代码:



 

         将数据按name分组,针对每组取出不同的成分,再追加到B1中。结果如下:



 

  • 大小: 8.8 KB
  • 大小: 7.7 KB
  • 大小: 13.8 KB
  • 大小: 21.8 KB
  • 大小: 11.6 KB
  • 大小: 75.2 KB
  • 大小: 68.7 KB
  • 大小: 15.3 KB
  • 大小: 16.7 KB
  • 大小: 3.8 KB
  • 大小: 20.2 KB
  • 大小: 8.3 KB
  • 大小: 4.2 KB
  • 大小: 12.8 KB
  • 大小: 4.4 KB
  • 大小: 12.7 KB
  • 大小: 22.4 KB
  • 大小: 6.4 KB
  • 大小: 29.9 KB
  • 大小: 18.5 KB
0
0
分享到:
评论

相关推荐

    Microsoft SQL Server 2005 Express Edition SP3

    在开始安装 SQL Server 之前,系统配置检查器 (SCC) 会验证性能监视器计数器注册表项的值。如果 SCC 无法验证现有的注册表项,或者 SCC 无法运行 Lodctr.exe 系统程序,则 SCC 检查会失败,并且安装程序会被阻止。若...

    经典SQL语句大全

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else ...

    SQL查询安全性及性能优化

    并不需要SQL语句真正执行,是优化器估算的计算 来自数据库的统计信息,统计信息月准确,执行计划月精确 说明:网络经验:后者效率高于前者,但是以上两个查询语句的性能通过查询计划可以看出其实是一样的,后者...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    11.4 动态SQL:用ExEC命令动态生成代码 11.5 控制流语句 11.5.1 IFELSE语句 11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 ...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    11.4 动态SQL:用ExEC命令动态生成代码 11.5 控制流语句 11.5.1 IFELSE语句 11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    8.9.1 动态SQL 221 8.9.2 嵌套分析函数 222 8.9.3 并行 223 8.9.4 PGA大小 224 8.10 组织行为 224 8.11 小结 224 第9章 Model子句 225 9.1 电子表格 225 9.2 通过Model子句进行跨行引用 226 9.2.1 示例数据...

    sql经典语句一部分

    经典SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice ...

    数据库操作语句大全(sql)

    数据库操作语句大全(sql) 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_...

    EOS Report开发指南

    04.04.01.01.04 设置计算列 04.04.01.01.05 编辑数据集变量 04.04.01.01.06 记录过滤 04.04.01.01.07 提取记录数 04.04.01.01.08 预览数据集 04.04.01.01.09 动态SQL 04.04.01.02 创建SDO数据集 04.04.01.03 ...

    ado[1].net中文手册 学习 ado.net的重要资料

    用表达式创建数据集列:描述如何在数据集表中定义基于计算或其他表达式(而不是直接基于数据源中的数据)的列。 将表添加到现有数据集:描述如何在以前创建的类型化数据集中创建新数据表。 将现有类型化数据集添加到...

    asp.net知识库

    使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取数据库中某个某个表的创建脚本 DbHelperV2 - Teddy的通用数据库访问组件设计...

    Java范例开发大全 (源程序)

     实例17 如何列出素数 29  实例18 Java中的递归 31  实例19 男生女生各多少人 32  实例20 求水仙花数 34  实例21 求任意一个正数的阶乘 35  实例22 求n的n次方 35  实例23 利用for循环输出几何图形 36 ...

    Oracle11g从入门到精通

    4.1.3 PL/SQL字符集 4.1.4 PL/SQL数据类型 4.1.5 PIJSQL变量和常量 4.1.6 PL/SQL语句控制结构 4.1.7 PL/SQL表达式 4.2 PL/SQL的游标 4.2.1 基本原理 4.2.2 显式游标 4.2.3 隐式游标 4.2.4 游标属性 4.2.5...

    Oracle11g从入门到精通2

    4.1.3 PL/SQL字符集 4.1.4 PL/SQL数据类型 4.1.5 PIJSQL变量和常量 4.1.6 PL/SQL语句控制结构 4.1.7 PL/SQL表达式 4.2 PL/SQL的游标 4.2.1 基本原理 4.2.2 显式游标 4.2.3 隐式游标 4.2.4 游标...

    LINQ 实战 1/11

    7.1.4 LINQ to SQL设计器 188 7.2 将查询表达式转换为SQL 190 7.2.1 IQueryable接口 190 7.2.2 表达式树 191 7.3 业务实体的生命周期 193 7.3.1 跟踪变化 195 7.3.2 提交变化 196 7.3.3 操作离线数据...

Global site tag (gtag.js) - Google Analytics