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

简化SQL计算之分组中的关联计算

阅读更多

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算。由于SQL分组时必须同时汇总,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层的子查询的高级技巧来实现。集算器支持真正的分组,直观的对象式关联访问,解决这类问题更加容易。

分组关联在实际业务中遇到的较多,比如http://forums.bit-tech.net/showthread.php?t=207052。下面以链接中的实际业务为蓝本设计一个更通用的例子,用来说明集算器实现分组关联的具体过程。

计算目标:查询出缺货的DVD分店,即现存的DVD拷贝不到4类的分店。

数据结构Branch表,存储DVD分店信息。DVD表,存储DVD的标题及分类信息,DVD是虚拟的数据,比如“变形金刚4”是一个DVD,但它不是一张可见的光盘。DVDCopy表,存储DVD的多张拷贝,DVD拷贝是真正的光盘,以实体形式存放于各个分店。注意:DVDCopy表以BranchID字段和Branch表关联,以DVDID字段和DVD表关联。下面是部分数据:

 

Branch表:



 

DVD表:



 

DVDCopy表:



 

说明:

            1、 <!--[endif]-->计算结果应当是Branch表中的某些记录。

            2、DVDCopy表中的Status字段如果是“Miss”,则说明光盘丢失。LastDateReturned字段如果为空,则说明光盘借出尚未归还。显然,丢失或未归还的光盘不在计算范围内,应当过滤掉。

            3、应当考虑某些分店可能在DVDCopy表中不存在记录,虽然这种情况比较罕见。

解题思路

            A、DVDCopy表过滤出有效的、店里现存的DVD拷贝。

            B、按照BIDDVDCopy表分组,每组就是一个门店所有的DVD拷贝。

            C、找到每个门店对应的DVD拷贝对应的DVD,再计算出这些DVD的分类数量。

            D、查询出现存的DVD分类数量小于4的门店,这样的门店符合要求

            E、找到DVDCopy表中没出现过的门店,这样的门店也符合要求。

         F、将两类符合要求的门店合并。 

 

集算器代码



 

            A1-A3:从数据库中检索数据,分别命名为变量BranchDVDDVDCopy。计算解结果如下:



 

            A4:将DVDCopy表中的DVDID字段,切换成DVD表中对应的记录,将BID字段切换成Branch表中对应的记录。注意:这一步是对象式关联访问的基础,需要使用switch函数。计算后,DVDCopy如下:



 

            蓝色字体表示该字段对应为某条记录,点击后可查看,如下图:



 

            此时,只需用操作符“.”就可以进行对象式关联访问,比如DVDCopy.(DVDID). (Category)表示每个DVD拷贝对应的DVD的分类。DVDCopy.(BID)则可以取得每个DVD拷贝对应的分店详情(完整记录)。

 

            A5=DVDCopy.select(Status!="Miss" && LastDateReturned!=null)

 

            这句代码用来过滤数据,即:丢失的,未归还的DVD拷贝不在计算范围内,过滤后A5的值如下: 



 

            A6=A5.group(BID)

            上述代码用来对A5中的数据按照BID分组,每行代表一个门店的所有DVD拷贝,如下:



 

            点击蓝色字体,可以看到组内成员:



 

可以看到,函数group只对数据进行分组,并不需要同时进行汇总计算,这一点和SQL中的分组函数不同。有时候我们需要对分组后的数据进行较深入的加工,而不是简单的汇总,这时用集算器的group函数会更方便,比如A7中的代码。

A7=A6.new( ~.BID:BonList, ~.(DVDID).id(Category).count():CatCount )

            上述代码用来计算每个门店对应的DVD拷贝各有几类。函数new可以根据A6中的数据生成新的对象A7A7有两个列:BonListCatCountBonList直接来自A6中组内数据的BID列,CatCount来自于组内数据的DVDID列。CatCount的算法分为三部分:~.(DVDID)找到每个门店所有的DVD拷贝对应的DVD记录;id(Category)去除这些DVD记录中重复的Categorycount()用来计算Category的数量。计算结果如下:



 

即:B002门店有3DVD拷贝,B003门店有3类,B001门店有4类。

 

A8A7.select(CatCount<4)

            上述代码执行查询,求出CatCount小于4的门店,结果如下:



 

上述缺货的门店是根据DVDCopy表计算出的。但有些严重缺货的门店也许不会出现在DVDCopy表,比如该门店所有的DVD拷贝都借出去了,或者该门店完全没有DVD拷贝,因此要把这部分门店合并进来,代码如下:

A9=A8.(BonList) | (Branch \ A7.(BonList))

            上述代码中,运算符“|”表示将两个数据集进行并集计算(可用union函数代替),运算符“\”表示差集计算(可用函数diff代替)。A8.(BonList)BranchA7.(BonList)分别代表:DVDCopy表中缺货的门店、所有的门店、DVDCopy表中出现过的门店,其值分别为:



 

            A9就是本案例最终的计算结果,其值为:



 

也可以用间接办法实现本案例,比如:先计算出来“不缺货的门店”,然后和Branch表做差集,计算结果应当和A9一样。

需要注意的是,SQL缺乏显式集合,不能用A8Branch这样的变量来代表数据集,因此上述简短的代码必须用几个冗长的SQL才能实现。

 

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

  • 大小: 14.8 KB
  • 大小: 34.4 KB
  • 大小: 123.2 KB
  • 大小: 77.1 KB
  • 大小: 86.6 KB
  • 大小: 16.9 KB
  • 大小: 44.6 KB
  • 大小: 48.6 KB
  • 大小: 11.6 KB
  • 大小: 71.2 KB
  • 大小: 7.1 KB
  • 大小: 5.9 KB
  • 大小: 32.3 KB
  • 大小: 10.2 KB
0
0
分享到:
评论

相关推荐

    sql语句在sas中的应用

    连接操作是SQL中最常用的数据组合方法之一,主要用于从两个或更多表中检索数据。通过连接操作,可以在多个表之间建立关联,并基于某些共同字段合并数据。 **3.3 复杂连接** 除了基本的连接类型外,还有一些更复杂的...

    全国计算机二级考试之第四章SQL(二)(ppt文档).ppt

    本章节主要讲解了SQL的几个关键概念,包括分组与计算查询、空值查询、别名查询、使用量词和谓词的查询以及超连接查询。 首先,分组与计算查询是通过`GROUP BY`语句实现的,它允许我们将数据按照一个或多个字段的值...

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

    在SQL试题中,你可以找到关于查询、更新、插入和删除数据的各种问题,以及更高级的概念如联接、子查询、聚合函数等。本资料集合包含了这些知识点的具体实例,帮助你深化对SQL的理解并提升实践能力。 一、SQL试题及...

    sql中文查询手册

    4. GROUP BY与聚合函数:用于对数据进行分组并计算统计信息。例如: ```sql SELECT 字段1, COUNT(*) FROM 表名 GROUP BY 字段1; ``` 5. ORDER BY子句:用于对查询结果进行排序。例如: ```sql SELECT * FROM ...

    高效SQL学习笔记

    总结,SQL是一门强大且实用的语言,无论是在数据仓库分析、应用程序开发还是日常的数据管理中,都有其不可或缺的地位。通过不断的学习和实践,你将能够更加熟练地运用SQL,实现高效的数据处理和决策支持。

    sql语句学习入门

    SQL提供了许多内置函数来执行不同类型的计算和操作数据,例如: - AVG()、COUNT()、FIRST()、LAST()、MAX()、MIN()、SUM()用于聚合数据。 - GROUP BY用于结合聚合函数,按照一个或多个列对结果集进行分组。 - ...

    SQL 参考手册中文版.chm

    SQL参考手册中可能还会详细介绍视图(VIEW)的概念,视图是基于一个或多个表的虚拟表,可以简化复杂的查询并提供安全性。索引(INDEX)是提高查询性能的关键,它们加速了数据的查找过程。 另外,存储过程(STORED ...

    程序员的SQL金典.rar

    轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。  本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在...

    SQl server练习50题

    在SQL Server的学习过程中,实践是提升技能的关键。"SQL Server练习50题"是一个非常实用的资源,旨在帮助用户巩固SQL Server的基础知识,特别是查询和多表查询这两方面的重要技能。下面将对这两个主题进行详细讲解。...

    创意sql--------

    1. **窗口函数**:窗口函数是SQL中的一个强大工具,允许在结果集中进行行间计算,如排名、累计和移动平均。例如,`ROW_NUMBER()`、`RANK()` 和 `DENSE_RANK()` 可用于生成行号,`LEAD()` 和 `LAG()` 可获取当前行...

    Oracle 10g中的高级SQL函数

    游标允许你逐行处理结果集,而集合操作如 `%TYPE` 和 `%ROWTYPE` 则简化了PL/SQL程序中数据类型的处理。`BULK COLLECT` 和 `FORALL` 提高了大量数据操作的效率。 七、日期和时间函数 Oracle 10g提供了丰富的日期和...

    SQL手册 中文版 SQL手册 中文版

    5. 子查询:介绍如何在查询中嵌套SQL查询,用于比较、过滤或计算,以及在WHERE或HAVING子句中使用子查询。 6. 视图:解释视图的概念,它是虚拟表,基于一个或多个基表的查询结果,可以简化复杂查询并保护数据。 7....

    sql学习心得5篇汇总.docx

    在学习SQL的过程中,我们可以了解到其强大的功能,包括但不限于创建、修改和查询数据库中的数据。SQL使得用户无需关心具体的数据处理过程,只需描述想要执行的操作即可。 在基础阶段,SQL学习主要包括以下几个核心...

    SQL小实践课件,操作代码

    在SQL学习的旅程中,实践经验至关重要。"SQL小实践课件,操作代码"是一个专为初学者设计的资源包,旨在通过实际操作帮助你掌握SQL基础。这份课件结合了理论与实践,使你能深入理解...祝你在SQL的学习之旅中取得成功!

    零基础学SQL

    对于初学者来说,了解SQL的基础概念、语法以及如何在实际场景中应用是非常重要的。本教程"零基础学SQL"旨在帮助那些对数据库操作一无所知的人快速入门。 一、SQL基础 1. 数据库概念:SQL主要用于操作关系型数据库...

    菜鸟教程 sql教程

    你可以根据需要选择要查询的列,使用WHERE子句过滤数据,用ORDER BY进行排序,GROUP BY进行分组,以及使用聚合函数(如COUNT、SUM、AVG、MAX、MIN)进行计算。 6. 更新数据:UPDATE语句用于修改已存在的数据,常与...

    常用复杂sql语句

    根据提供的文件信息,我们可以归纳出几个重要的SQL知识点,这些知识点主要围绕着复杂的SQL查询操作,包括子查询、分组查询、以及多表关联等高级特性。下面将详细展开这些知识点。 ### 一、子查询与分组查询 #### 1...

    经典sql查询整理

    "经典SQL查询整理"这个资源聚焦于SQL面试中的常见问题,旨在帮助用户提升SQL技能,更好地应对工作或学习中的挑战。 首先,SQL的核心功能包括以下几点: 1. **数据查询**:SQL的SELECT语句是其最基础也是最重要的...

    从实践中学习Oracle/SQL

    在更复杂的查询中,`JOIN`操作允许将多个表的数据关联起来,`SUBQUERY`(子查询)可在查询中嵌套查询,提供更灵活的数据检索方式。 在实践中,了解Oracle的性能优化至关重要。这可能涉及调整SQL查询,使用绑定变量...

Global site tag (gtag.js) - Google Analytics