订购了所有产品客户及其它客户的平均账户余额

下面是一个企业订单情况的数据库内的一些表格,首先是 Customers 表,记录了客户 ID 和客户的账户余额:

..

Orders 表记录了每个订单以及它的客户:

..

OrderDetails 表记录了每个订单的详细信息,包括订购的产品 ID 以及数量:

..

Products表记录了企业所有的产品信息:

..

现在需要计算,订购了公司所有产品的顾客的平均 acct_balance(账户余额),以及其他顾客的平均账户余额。

首先要利用外键转换,将各个表的关联实质化起来,即将 item_id、order_id、customer_id 等字段都替换成对应的记录,这样最后得到的 Orders 表就关联了其它所有的表,从 Order 表的任一记录出发都可以直接提取其它表内其相应的记录。而后将 Orders 表按客户分组,并同时算出每人购买的不重复产品数量,比较这个数量和 Products 表中的总产品数量,选出相等的客户,即为购买了所有产品的客户了,而全部客户的集合和它们的差集也就是未购买所有产品的顾客了,分别求出他们的平均账户余额即可。


A

B

1

=T("Customers.txt").keys(customer_id)

=T("Orders.txt")

2

=T("OrderDetails.txt").keys(order_id)

=T("Products.txt").keys(item_id)

3

>B1.switch(order_id,A2; customer_id,A1), A2.switch(item_id,B2)

=B1.groups(customer_id:customer; icount(order_id.item_id):items_cnt)

4

=all=B2.len(),B3.select(items_cnt==all)


5

=A4.avg(customer.acct_balance)

=(B3\A4).avg(customer.acct_balance)

https://try.esproc.com/splx?3jL

A1读出客户表,并设定主键,B1 读出订单表,A2 读出订单明细表并设定主键,B2 读出产品表并设定主键。

A3用 switch 执行外键关联,将订单的订单编号和客户编号转换为对应的记录,将订单明细表中的产品名称也转换为对应的记录。

B3对订单数据执行分组汇总,计算每位客户的订单中订购产品的总种类数,汇总计算时用 icount 只计算不同产品的总数,结果如下:

..

A4选出订购了所有产品的客户数据:

..

A5计算出订购了所有产品客户的平均账号余额:

..

A6计算出其它客户的平均账号余额:

..