被数据库厂商扩展后的SQL也可动态拼接出语句执行,但SQL的集合运算和有序计算不方便,实现动态列计算很繁琐,往往要借助高级语言拼出动态SQL。
免费的集算器支持动态脚本、有序计算、显式集合,可以弥补这一不足。下面举例说明SQL开发中常见的动态列计算问题,以及集算器对应的解法。
列间排序
表order有6个整数类型的字段,现在要对每条记录的字段值进行排序,使其按从小到大的顺序横向排列。源数据如下:
集算器代码:
先执行SQL,再循环处理每条记录,处理过程为:将当前记录的字段值用函数array转为集合,再用sort函数排序,最后用函数record写入当前记录。结果如下:
动态拼Merge语句
参数source和target代表MSSQL中两个结构相同但数据不同的表,要求以主键为标准用source更新target,比如table1和table2的主键都是A和B,数据如下:
用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的主键和字段,分别存在变量pks和columns中,之后用循环函数pks.(…)动态生成merge语句,其中~表示循环变量,#表示循环计数。
上述代码只是生成merge语句,可将该语句返回给JAVA执行,也可以在集算器中执行,代码即:A6=myDB1.excute(A5) 。
跨库动态merge运算
前面的例子假设source和target在同一个数据库,但如果两者分属不同的数据库(比如MSSQL和Oracle),则无法拼出相应的merge语句,此时可用集算器实现merge计算。代码如下:
myDB2/myDB1分别指向source/target所在数据库,A3\A4以游标的形式打开数据库,使用join@x1函数对游标进行左连接,之后每次从A5取一批数据到内存,使用update函数更新target,其中@i表示只生成insert语句,@u表示只生成update语句。执行后target如下:
这个方法也可以应用于那些不支持MERGE语句的数据库,如MySQL。
字段含表名的动态SQL
表A有两个字段:ID、TableName,TableName存储其他表的表名,比如B、C、D等,这些表结构相同,都以ID为关键字。表A的ID字段存储其他表的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中。结果如下:
相关推荐
本教程“SQL基础教程-Mick-示例程序&习题答案”由Mick编写,旨在为初学者提供一个实用的学习资源,帮助他们快速掌握SQL的核心概念和操作。 1. SQL基础知识: - 数据类型:SQL支持多种数据类型,如整数(INT)、...
Vertica是一个面向列的高性能分析数据库,特别适合于处理大规模数据集。本文的知识点涉及到了SQL查询优化、联结操作、聚合计算以及查询执行路径等方面。 首先,文档中提到了两个具体的查询示例。第一个查询示例通过...
在SQL查询中,有时我们需要计算特定数据的比例,并且在结果显示时加上百分号(%),以直观展示比例关系。本文将详细解析如何通过SQL语句实现这一功能,包括但不限于使用`COUNT()`函数、嵌套查询、类型转换等技术点。...
文档中的示例代码显示了如何在一个包含混合类型(如字符串和数值)的表中执行查询,并通过不同的SQL Server版本(2000与2005)来实现对特定字段的聚合操作。 ### SQL Server 2000 版本动态字段查询 #### 1. 创建表...
数据源应能支持动态的列结构,例如SQL Server的存储过程或自定义的ADO.NET数据集。 2. **创建数据视图**:在水晶报表中,你可以使用“字段浏览器”来添加数据源中的字段到报表。然而,对于动态列,你需要创建一个...
MSSQL SQL Server 使用 SQL 脚本实现相邻两条数据相减 MSSQL SQL Server 是一种关系型数据库管理系统,广泛应用于各种行业和领域。有时,我们需要对数据库中的数据进行操作,例如计算相邻两条数据的差异。在本文中...
本主题将深入探讨如何实现数据集之间的参数传递以及列的绑定,以充分利用BIRT的功能来创建高效的报告。 首先,我们要理解什么是数据集。在BIRT中,数据集是一个预定义的SQL查询或者一个数据源查询,它从数据库或者...
在SQL中,`GROUP BY`语句用于将数据根据一个或多个列进行分类,例如在示例代码中,我们根据`A.DocNo`, `A1.Item_ItemCode`, `A2.LineNum`, `A2.ARBillLine`, `A2.Maturity`, `A2.AROCMoney_TotalMoney`和`A2....
### SQL服务器分页返回结果集 #### 知识点概览 - **SQL分页查询原理** - **存储过程在SQL Server中的应用** - **动态SQL的构建与执行** - **使用`ROW_NUMBER()`进行分页** #### SQL分页查询原理 在数据库查询中,...
在本示例中,我们将探讨如何在Visual Studio环境下创建和实现一个简单的多维数据集。 首先,让我们了解什么是多维数据集。多维数据集是一种数据组织方式,它以多维度的方式存储数据,如时间、产品、地区等,这些...
### SQL 2008 行列转换 (Pivot) 的动态实现 #### 知识点一:行列转换(Pivot)的概念与应用场景 在数据库查询中,有时我们需要将数据表中的行转换为列,或者将列转换为行,这种操作被称为行列转换。行列转换在报表...
在SQL语句中实现间隔行相减是一种较为高级的数据处理技巧,主要应用于需要对数据集中的数值进行基于位置的计算场景。例如,在财务分析、时间序列数据处理或统计学研究中,这种操作可以帮助我们理解数据随时间或其他...
在此基础上,我们需要构建一个完整的动态SQL语句来实现行转列的操作。这包括使用`CASE`语句来为每个转横字段分配正确的值: ```sql SET @str = 'select 布号, 疵点, 分数, ' + @str + ' from dbo.mmFabric'; ``` 这...
此脚本实现了每天创建一次完整备份的功能,并通过日期动态生成备份文件名,确保每个备份文件名的唯一性。 ##### 删除旧备份 为了释放磁盘空间,需要定期删除旧的备份文件。通常根据备份策略,保留一定周期内的备份...
### 企业报表横纵坐标转换的SQL实现功能 #### 实例1:纵坐标到横坐标的转换 在实例1中,需求是将一个表格中的数据按照特定的方式进行重组,即从传统的纵列形式转换为横列形式。这种转换在数据分析和报告制作中十分...
本例中通过动态SQL生成了多个列,每个列代表了一个特定的`buildNo`的`CheckInDay`值。 ### 表结构定义 此外,还提供了一段创建`ReportData`表的DDL语句,该表包含了员工住宿的相关信息。通过这张表可以了解住宿...
本示例将围绕“SQL计数”这一主题,详细介绍如何在SQL查询中实现计数功能。 首先,SQL提供了一个内置的聚合函数`COUNT()`,它用于计算指定列的值的数量。如果在`COUNT()`函数内不指定任何列名,它会返回表中的所有...
总结,通过前端和后端的协同工作,我们可以实现SQL Server数据库的分页查询。前端负责展示数据和分页导航,后端负责处理分页请求并返回分页数据。同时,注意性能优化,确保用户体验和系统效率。
4. **分组查询**:`GROUP BY`语句用于将数据按一个或多个列进行分组,常与聚合函数(如`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`)结合使用,例如`SELECT 列1, COUNT(*) FROM 表名 GROUP BY 列1`计算每组的数量。...
在MySQL数据库中,通常我们不直接使用SQL来执行排序算法如冒泡排序,因为SQL是设计用来查询和操作数据的,而不是执行通用的计算或算法任务。然而,为了教学目的,我们可以尝试模拟冒泡排序的过程,但请注意这种方法...