订购了所有产品的客户

 

问题

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

imagepng

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

imagepng

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

imagepng

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

imagepng

现在问题是为每一个订购了公司所有产品的顾客求出平均 acct_balance(账户余额),并为每一个没有订购所有产品的顾客求出平均账户余额。

思路

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

  1. 定义好 OrderDetails、Customers、Products 表中的主键,即 *_id 字段。

  2. 用 switch 函数,将 Orders 表中的 order_id 字段值都替换成 OrderDetails 表中相应的记录,customer_id 字段值替换成 Customers 表中相应的记录,OrderDetails 表中 item_id 字段值替换成 Products 表中相应的记录。

  3. 将 Orders 表按客户分组,并算出每个客户购买的不重复产品数量,创建新序表。

  4. 选出产品数量等于 Products 表中记录总数的客户。

  5. 求出这些客户的平均账户余额。

  6. 求出剩下那些客户的平均账户余额。

代码

A
1 =file("C:\\txt\\Orders.txt").import@t() Orders 表
2 =file("C:\\txt\\OrderDetails.txt").import@t() OrderDetails 表
3 =file("C:\\txt\\Customers.txt").import@t() Customers 表
4 =file("C:\\txt\\Products2.txt").import@t() Products 表
5 >A3.keys(customer_id), A2.keys(order_id), A4.keys(item_id) 定义各表的主键
6 >A1.switch(order_id,A2; customer_id,A3), A2.switch(item_id,A4) 将 Orders 和 OrderDetails 表中的 id 字段都替换为记录
7 =A1.group(customer_id:customer;~:orders,~.id(order_id.item_id).len():items_cnt) 将 Orders 表按顾客分组, 同时算出每人购买的不重复产品数量
8 =A7.select(items_cnt==A4.len()) 产品数量等于总产品数量的记录
9 =A8.avg(customer.acct_balance) 这些客户的平均账户余额
10 =(A7\A8).avg(customer.acct_balance) 其他客户的平均账户余额

结果

订购了所有产品的客户的平均账户余额:

imagepng

没有订购所有产品的客户的平均账户余额:

imagepng