简化SQL计算之竖排多层数据

   在我们经常处理的复杂SQL计算,常会遇到这种需求:请将分组数据按顺序拼为一列,并将分组和明细标识为不同的类型,如下所示:



  此类算法常见于为报表整理数据,SQL缺少有序集合的机制,需要分组和明细分别设置用于排序的计算列,再将分组和明细合并,最后做排序。实现这种算法,SQL往往要用非ansi标准的特殊函数去实现,代码比较难写,也不易理解。如果对多级分组进行拼凑,将更加难以实现。

用集算器实现此类算法时无需计算列,代码简洁易懂,下面用一个例子来说明。

计算目标

针对DVDCopy表,将门店及其对应的DVD拷贝拼为一列。

数据结构:

DVD表的前三个字段是:CopyIDDVDIDBID,分别代表DVD拷贝的编号、DVD的编号、门店的编号,DVD拷贝和门店是多对1的关系。部分数据如下:



 

计算结果应该是这样的:

扫描二维码关注公众号,回复: 1134261 查看本文章



 

集算器代码:



 

A1:从数据库读取数据,并按BID字段排序,结果如下:



 

A2=create(value,type)。建立一个空序表A2,有valuetype这两个字段。

A3-C4:遍历A1中的数据,并向A2追加BIDCopyID。具体算法是:如果当前记录的BID发生了变化B3中的代码),则在A2中追加一条门店记录(C3中的代码);修改B2为当前记录的BIDB4中的代码),以便在下一条记录中比较BID是否发生变化;追加一条DVD拷贝记录(C4中的代码)。

A3中的代码for A1表示对A1进行循环遍历,每次取A1中的一条记录,在循环体中可以用变量A3来访问当前记录,比如A3.BID。循环语句的作用范围可以直接用单元格缩进来表示,A3的作用范围即B3-C4

 

循环遍历后,最终计算结果会存储在A2中,如下图:



 

延伸:拼合多层分组

 

前面的案例只有两层:BIDCopyID,事实上BIDDVDIDCopyID可以组成三层数据。依靠类似的办法,集算器同样可以把三层数据拼成一列,代码如下:



 

计算结果如下所示:



 

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

猜你喜欢

转载自datamachine.iteye.com/blog/2204353