【Demo案例】多表关联/嵌套:购买了相同产品的客户
任务
使用集算器作为java的计算层,求:哪些客户购买了相同的指定产品?
数据库中有2张表, 部分数据如下:
常规的解决思路如下:
- 1. 将AllOrders table 按照Customer_id分组
- 2. 取得item_id的集合
- 3. 除去重复的成员
- 4. 最后按照指定的item列表过滤,即可获得所求目标
如图所示:
步骤
- 取数据
直接书写SQL,从各表取出数据
点击每个单元格可以直观地看到对应的计算结果,比如A2中的AllOrders
定义外部参数:指定的产品列表 - 分组
下面将A2按照customer_id分组
在A3中引用A2的计算结果
customer_id是分组依据,命名为customer
”~”表示每组的成员蓝色字体表示这个成员是一个集合,点击可以看到该集合的下级成员这是A3的第一个成员中的”OrderList”字段所包含的成员。显然,分组的结果是集合,集合的成员可以是另一个集合。集合可以方便的对分组后的数据进行加工。 - 对象引用
A4:将这些item_id取出形成新列:ItemList
通过对象引用的方式,集算器可以轻松访问多级集合的成员A5:过滤重复值
从而得到客户1购买过的不重复的itemA3-A5是分步的计算,即将计算目标尽可能细化。
这样的好处是可以将复杂的计算目标简化为多个简单的步骤:- 循序渐进
- 直观的观察再加工
- 减少bug的可能性
也可以像B3这样一步写出,B3等价于A3-A5
这样的好处是代码更短更敏捷B6:引用外部参数并过滤出符合条件的客户
通过对象引用,集算器轻松实现了计算目标.
在Java或报表工具中可以通过JDBC调用这一计算结果。 - 多表关联
如果用SQL进一步计算B6中的客户帐户余额的平均值,就会涉及到多表和嵌套的关联计算集算器的对象引用可以避免这种复杂的算法
在A3插入一行,建立对象引用
这表示用A2中的customer_id字段引用A1中对应的记录。
B7继承了这种引用关系
B8:利用对象引用轻松算出B7中的平均值
注意,移动单元格时,公式会智能变更而无须手工修改,比如A4\B4中的公式未变,A5\A6\B7中的公式自动变化 - 集合运算
其他用户的帐户余额呢?即B4中去掉B7中的用户,他们的平均余额呢?
如下图中的C9:“B4\B7”,这表示2个集合的“差集”
集合运算可以直观解决这类问题,SQL没有集算器的显式集合,同样的运算要转化为复杂的多表关联查询。