订购了所有产品的客户
问题
下面是一个企业订单情况的数据库内的一些表格,首先是 Customers 表,记录了客户 ID 和客户的账户余额:
Orders 表记录了每个订单以及它的客户:
OrderDetails 表记录了每个订单的详细信息,包括订购的产品 ID 以及数量:
Products 表记录了企业所有的产品信息:
现在问题是为每一个订购了公司所有产品的顾客求出平均 acct_balance(账户余额),并为每一个没有订购所有产品的顾客求出平均账户余额。
思路
大致思路:首先要利用集算器指针引用的特性,将各个表的关联实质化起来,即将 item_id、order_id、customer_id 等字段都替换成对应的记录,这样最后得到的 Orders 表就关联了其它所有的表,从 Order 表的任一记录出发都可以直接提取其它表内其相应的记录。而后将 Orders 表按顾客分组,并同时算出每人购买的不重复产品数量,比较这个数量和 Products 表中的总产品数量,选出相等的客户,即为购买了所有产品的客户了,而全部客户的集合和它们的差集也就是未购买所有产品的顾客了,分别求出他们的平均账户余额即可。
-
定义好 OrderDetails、Customers、Products 表中的主键,即 *_id 字段。
-
用 switch 函数,将 Orders 表中的 order_id 字段值都替换成 OrderDetails 表中相应的记录,customer_id 字段值替换成 Customers 表中相应的记录,OrderDetails 表中 item_id 字段值替换成 Products 表中相应的记录。
-
将 Orders 表按客户分组,并算出每个客户购买的不重复产品数量,创建新序表。
-
选出产品数量等于 Products 表中记录总数的客户。
-
求出这些客户的平均账户余额。
-
求出剩下那些客户的平均账户余额。
代码
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) | 其他客户的平均账户余额 |
结果
订购了所有产品的客户的平均账户余额:
没有订购所有产品的客户的平均账户余额:
英文版
数据文件
Customers.txt
OrderDetails.txt
Orders.txt
Products2.txt