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

简化SQL式计算之行列转置

阅读更多

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,行列转置就是其中一种。实现这类算法,Oracle可以使用pivot函数,但其他数据库没有相应的函数,因此代码比较难写,也不易理解和维护。另外,pivot函数只能实现固定列的转置,对于非固定列则无能为力,其他数据库同样无法实现非固定列的转置,通常都要求助于高级语言来实现动态SQL

用集算器实现此类算法会更加简洁易懂,下面用一个例子来说明。

 

数据库表SALES存储着订单数据,部分数据如下:



 

现在要计算出2013年各月份订单的总金额、最大订单金额、最小订单金额,以及总订单数,并将数据转置成134行,即:四种算法是第一列,列名为subtotal,每个月占一列,列名分别是1234…其中前五个字段如下:



 

集算器代码:



 

A1:执行SQL,过滤出2013年的数据,并按月份分组汇总,结果如下:

 


 

这句SQL很简单,任何数据库都支持这种分组汇总,困难在于后续的行列置换。

 

A2=create(subtotal).record(["OSum","OMAX","OMIN","OCount"])

上面这句代码生成一个空的序表,这个序表只有一个字段:subtotal,结果如下:



 

       说明:序表是集算器的一种数据类型,是带有结构的二维表,类似SQL数据表,但功能更强大,用法更灵活。另外,A1也是个序表。

 

B2=A2.derive(${to(A1.len()).string()})

 

上面这句代码在A2的基础上增加12个列,形成转置后的数据结构,结果如下:



 

函数derive可以给现有的序表增加新列,形成新的序表,比如derive(1)表示增加1列,字段名为1,字段值和列名相同,derive(0:field1, null:field2)表示增加2列,字段名分别为field1field2,字段值分别为0null

根据转置要求,这里应当增加12个列,代码应当是derive(1,2,3,4,5,6,7,8,9,10,11,12),为了动态生成这段代码,这里使用了宏,即${},宏的作用是将字符串转为表达式。其中to(A1.len())是个序列,值为[1,2,3,4,5,6,7,8,9,10,11,12],函数string()可以将这个序列转为字符串“1,2,3,4,5,6,7,8,9,10,11,12”。

 

A3-A5:对A1进行循环,每次访问一条记录,算法是将这条记录纵向拼接,并修改序表B2中对应的列。值得注意的是,只需要用缩进就能表达循环语句的作用范围,而不需要用{}begin/end来指定,因此B4B5在作用范围内,而A4A5不在作用范围。

说明:在集算器的循环体内,循环变量就是for语句所在的单元格。换句话说,可以用A3来引用当前记录,可以用A3.MONTH来引用当前记录的MONTH字段。

 

B4=A3.OSum | A3.OMAX | A3.OMIN | A3.OCount

上面这句代码用来将当前记录的汇总字段纵向拼接起来,运算符“|”表示拼接,比如A112月份的记录拼接后是这样的:



 

代码中的A3.OSum表示当前记录的OSum字段,由于OSum字段是记录中的第2个字段,因此也可以按序号来引用,写作A3.#2,所以上述语句等价为:B4=A3.#2 | A3.#3 | A3.#4 | A3.#5

 

B5=eval("B2.run(B4(#):#"+ string(#A3+1)+ ")")

上述代码的意义是:修改B2中的字段,数据来自B4

函数eval用来将字符串动态解析为表达式,比如eval("2+3")的计算结果是5,再比如本例中,循环到12月份时,eval中的字符串就是:B2.run(B4(#): #13),这表示按照B2的记录序号,依次将B4的成员插入B2的第13列(即12月份)。

修改字段使用的函数是run,比如run(field1+field2:field1, 0:#2)表示将field1的值改为field1+field2,将第2个字段(即#2)的值变成0

#A3表示当前的循环计数,第一次循环时这个值等于1,第二次等于2,以此类推。

 

 

循环语句A3-B5执行后,B2中的数据就是最终的计算结果,前几列如下:



 

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

0
13
分享到:
评论

相关推荐

    sql试题及答案,sql 行列转换,sql存储过程实例

    通过学习这些SQL试题、行列转换技巧和存储过程实例,你可以全面提升SQL技能,无论是日常的数据查询还是复杂的业务逻辑处理,都能得心应手。在实际工作中,不断练习和探索,将理论知识转化为实践能力,是成为SQL高手...

    oracle sql 行列转换

    在Oracle SQL中,行列转换是一种常见的数据操作需求,主要用于将数据表中的行转换为列,或将列转换为行,以此来满足不同的数据展示或分析需求。这种转换在处理多维度数据、汇总数据或是进行复杂查询时特别有用。下面...

    行列转换SQL存储过程代码

    ### 行列转换SQL存储过程代码解析 #### 核心知识点概述 本篇文章将深入探讨一个SQL存储过程的实现方式,该存储过程主要用于完成“行转列”(即行列转换)的操作。通过这种方式,可以有效地将数据库表中的行数据...

    SQL 数据行列转换

    ### SQL 数据行列转换 #### 知识点概览 1. **SQL Server中的行列转换**:介绍如何在SQL Server环境中利用内置函数实现数据从行到列的转换。 2. **FOR XML PATH() 函数的应用**:详细解释FOR XML PATH()函数在行列...

    SQL行列转换

    在实际的数据分析和报表制作过程中,我们经常需要将数据的列与行进行互换,这就是所谓的“SQL行列转换”。这种操作在处理汇总数据、创建透视表或者进行特定统计分析时尤其常见。以下我们将详细探讨SQL中的行列转换...

    sql表数据行列互换

    ### SQL表数据行列互换详解 在数据库管理与数据分析领域,有时我们需要对表格中的数据进行特殊的处理,例如将行转换为列或将列转换为行,这样的操作被称为“行列互换”。这种需求通常出现在汇总报告、数据透视等...

    SQL之行列互变问题

    ### SQL之行列互变问题详解 #### 一、引言 在处理数据库中的数据时,我们经常遇到需要将数据从一种格式转换为另一种格式的需求,其中最常见的一种就是行列互换的问题。例如,原始数据是按照列的形式存储的,而我们...

    oracle行列转换实例

    总的来说,Oracle 的分析函数提供了一种高效且灵活的方式来进行行列转换,简化了原本复杂的数据处理过程,提升了查询效率。通过理解分析函数的原理和用法,我们可以更好地管理和操作数据库中的数据,适应各种复杂的...

    SQLServer行列互转实现思路(聚合函数)

    在SQL Server中,行列互转是一种常见的数据处理需求,它能帮助我们以更直观的方式展示数据。本篇文章将深入探讨如何使用聚合函数Pivot和Unpivot来实现这一目标,特别是针对SQL Server数据库。 首先,让我们了解什么...

    oracle行列转换的例子

    ### Oracle 数据库中的行列转换详解 #### 一、引言 在处理复杂的数据查询与展示时,经常会遇到需要将数据库中的行数据转换成列数据的需求,这种操作通常被称为“行列转换”。例如,当我们想要汇总不同部门对各种...

    不定长的select交叉表查询,而且不用游标 sql 行列转化

    ### 不定长的SELECT交叉表查询,且不用游标:SQL行列转换技术解析 #### 一、背景介绍 在数据库管理中,数据的组织形式多种多样,有时我们需要将原本存储为行的数据转换成列的形式展示,反之亦然。这种转换在实际...

    sql经典 oracle的查询结果的行列互换

    ### Oracle SQL 中的行列互换技术详解 #### 一、引言 在处理数据库查询时,我们经常会遇到需要对查询结果进行格式调整的情况,其中一种常见的需求就是将数据的行列进行互换。例如,原始数据可能按列的形式存储了...

    行列转换实例

    从SQL Server 2005开始,引入了`PIVOT`操作符,简化了行列转换的操作。 **详细解释:** 1. **实现静态SQL:** ```sql SELECT * FROM (SELECT * FROM tb) a PIVOT (MAX(分数) FOR 课程 IN (语文,数学,物理)) b; `...

    sql server通过pivot对数据进行行列转换的方法

    总结起来,SQL Server的Pivot功能提供了强大的数据行列转换能力,使得数据的展现更加直观和清晰。掌握这一技巧对于提升数据处理效率和质量具有重要意义。在处理类似的时间序列数据或者分类数据时,Pivot操作尤其有用...

    Oracle行列转换_总结

    ### Oracle 行列转换知识点详解 #### 一、概述 在数据库操作中,有时需要将数据从行格式转换为列格式或反之亦然,这种需求通常被称为“行列转换”。Oracle 提供了多种方法来实现这样的转换,适用于不同的场景。本文...

    Oracle高级sql学习与练习

    11. 分析函数(ANALYTICAL FUNCTIONS)是Oracle SQL的高级特性之一,允许在数据集上进行窗口计算,例如累计求和、移动平均等,非常适合处理时序数据。 12. ROWID的使用涉及Oracle中的行标识符,可以用来快速访问表...

    SQL Server 2005新功能之PIVOT的描述

    在SQL Server 2005中,PIVOT是一个重要的新特性,它使得数据的行列转换更为便捷。在SQL Server 2000及其以前版本,如果需要将数据的某列值转换为行对应的列,通常需要使用复杂的CASE语句配合聚合函数(如SUM)来实现...

    Sql实现行列转换方便了我们存储数据和呈现数据

    在SQL数据库管理中,行列转换是一项重要的操作,它允许数据以不同的方式展示,以满足不同场景的需求。在MS SQL Server 2005版本中,微软引入了`PIVOT`和`UNPIVOT`两个关键字,极大地简化了这个过程。本文将详细探讨...

    Oracle.SQL必备参考(PDF)

    此外,还有分层查询(CONNECT BY)用于处理层次结构数据,以及PIVOT和UNPIVOT操作,分别用于行列转换。 4. **索引和优化**:索引能显著提高查询性能,Oracle支持B树索引、位图索引、函数索引等多种类型。理解如何...

Global site tag (gtag.js) - Google Analytics