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

集算器实现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
分享到:
评论

相关推荐

    SQL基础教程-Mick-示例程序&习题答案

    本教程“SQL基础教程-Mick-示例程序&习题答案”由Mick编写,旨在为初学者提供一个实用的学习资源,帮助他们快速掌握SQL的核心概念和操作。 1. SQL基础知识: - 数据类型:SQL支持多种数据类型,如整数(INT)、...

    SQL优化指导示例2.pdf

    Vertica是一个面向列的高性能分析数据库,特别适合于处理大规模数据集。本文的知识点涉及到了SQL查询优化、联结操作、聚合计算以及查询执行路径等方面。 首先,文档中提到了两个具体的查询示例。第一个查询示例通过...

    用sql语句求出占比,并且后面加%比

    在SQL查询中,有时我们需要计算特定数据的比例,并且在结果显示时加上百分号(%),以直观展示比例关系。本文将详细解析如何通过SQL语句实现这一功能,包括但不限于使用`COUNT()`函数、嵌套查询、类型转换等技术点。...

    SQL查询动态字段

    文档中的示例代码显示了如何在一个包含混合类型(如字符串和数值)的表中执行查询,并通过不同的SQL Server版本(2000与2005)来实现对特定字段的聚合操作。 ### SQL Server 2000 版本动态字段查询 #### 1. 创建表...

    水晶报表 实现列的动态增加

    数据源应能支持动态的列结构,例如SQL Server的存储过程或自定义的ADO.NET数据集。 2. **创建数据视图**:在水晶报表中,你可以使用“字段浏览器”来添加数据源中的字段到报表。然而,对于动态列,你需要创建一个...

    mssql sqlserver 使用sql脚本实现相邻两条数据相减.docx

    MSSQL SQL Server 使用 SQL 脚本实现相邻两条数据相减 MSSQL SQL Server 是一种关系型数据库管理系统,广泛应用于各种行业和领域。有时,我们需要对数据库中的数据进行操作,例如计算相邻两条数据的差异。在本文中...

    birt数据集参数与列绑定实现

    本主题将深入探讨如何实现数据集之间的参数传递以及列的绑定,以充分利用BIRT的功能来创建高效的报告。 首先,我们要理解什么是数据集。在BIRT中,数据集是一个预定义的SQL查询或者一个数据源查询,它从数据库或者...

    SQL Server分组排序取数据的实现

    在SQL中,`GROUP BY`语句用于将数据根据一个或多个列进行分类,例如在示例代码中,我们根据`A.DocNo`, `A1.Item_ItemCode`, `A2.LineNum`, `A2.ARBillLine`, `A2.Maturity`, `A2.AROCMoney_TotalMoney`和`A2....

    sql服务器分页返回结果集

    ### SQL服务器分页返回结果集 #### 知识点概览 - **SQL分页查询原理** - **存储过程在SQL Server中的应用** - **动态SQL的构建与执行** - **使用`ROW_NUMBER()`进行分页** #### SQL分页查询原理 在数据库查询中,...

    实现多维数据集的一个简易示例

    在本示例中,我们将探讨如何在Visual Studio环境下创建和实现一个简单的多维数据集。 首先,让我们了解什么是多维数据集。多维数据集是一种数据组织方式,它以多维度的方式存储数据,如时间、产品、地区等,这些...

    SQL 2008行列转换的pivot

    ### SQL 2008 行列转换 (Pivot) 的动态实现 #### 知识点一:行列转换(Pivot)的概念与应用场景 在数据库查询中,有时我们需要将数据表中的行转换为列,或者将列转换为行,这种操作被称为行列转换。行列转换在报表...

    SQL语句中如何做到间隔行相减

    在SQL语句中实现间隔行相减是一种较为高级的数据处理技巧,主要应用于需要对数据集中的数值进行基于位置的计算场景。例如,在财务分析、时间序列数据处理或统计学研究中,这种操作可以帮助我们理解数据随时间或其他...

    SQL行转列范例教程

    在此基础上,我们需要构建一个完整的动态SQL语句来实现行转列的操作。这包括使用`CASE`语句来为每个转横字段分配正确的值: ```sql SET @str = 'select 布号, 疵点, 分数, ' + @str + ' from dbo.mmFabric'; ``` 这...

    SQL Server 数据库日常维护脚本 合集

    此脚本实现了每天创建一次完整备份的功能,并通过日期动态生成备份文件名,确保每个备份文件名的唯一性。 ##### 删除旧备份 为了释放磁盘空间,需要定期删除旧的备份文件。通常根据备份策略,保留一定周期内的备份...

    企业报表横纵坐标转换的SQL实现功能

    ### 企业报表横纵坐标转换的SQL实现功能 #### 实例1:纵坐标到横坐标的转换 在实例1中,需求是将一个表格中的数据按照特定的方式进行重组,即从传统的纵列形式转换为横列形式。这种转换在数据分析和报告制作中十分...

    sql SERVER 20008

    本例中通过动态SQL生成了多个列,每个列代表了一个特定的`buildNo`的`CheckInDay`值。 ### 表结构定义 此外,还提供了一段创建`ReportData`表的DDL语句,该表包含了员工住宿的相关信息。通过这张表可以了解住宿...

    SQL计数

    本示例将围绕“SQL计数”这一主题,详细介绍如何在SQL查询中实现计数功能。 首先,SQL提供了一个内置的聚合函数`COUNT()`,它用于计算指定列的值的数量。如果在`COUNT()`函数内不指定任何列名,它会返回表中的所有...

    sqlserver 实现分页的前台代码 以及后台的sqlserver语句

    总结,通过前端和后端的协同工作,我们可以实现SQL Server数据库的分页查询。前端负责展示数据和分页导航,后端负责处理分页请求并返回分页数据。同时,注意性能优化,确保用户体验和系统效率。

    SQL各种查询方法

    4. **分组查询**:`GROUP BY`语句用于将数据按一个或多个列进行分组,常与聚合函数(如`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`)结合使用,例如`SELECT 列1, COUNT(*) FROM 表名 GROUP BY 列1`计算每组的数量。...

    使用SQL实现的冒泡排序算法 mysql数据库

    在MySQL数据库中,通常我们不直接使用SQL来执行排序算法如冒泡排序,因为SQL是设计用来查询和操作数据的,而不是执行通用的计算或算法任务。然而,为了教学目的,我们可以尝试模拟冒泡排序的过程,但请注意这种方法...

Global site tag (gtag.js) - Google Analytics