我有一个销售记录表,如下所示:
姓名 | 项目 | 行动 | 价格 | Num_Items |
---|---|---|---|---|
安 | 苹果 | 购买 | 5.00 | 10 |
安 | 苹果 | 出售 | 6.00 | 12 |
安 | 面包 | 出售 | 9.00 | 9 |
鲍勃 | 苹果 | 购买 | 5.00 | 14 |
鲍勃 | 盐 | 购买 | 1.00 | 10 |
鲍勃 | 盐 | 购买 | 1.00 | 1 |
鲍勃 | 盐 | 出售 | 2.00 | 2 |
sales_data: ([] Name: `Ann`Ann`Ann`Bob`Bob`Bob`Bob; Item: `Apple`Apple`Bread`Apple`Salt`Salt`Salt; Action: `Buy`Sell`Sell`Buy`Buy`Buy`Sell; Price: 5.00 6.00 9.00 5.00 1.00 1.00 2.00; Num_Items: 10 12 9 14 10 1 2)
输出是具有 >=1 买入和卖出的名称-物品对:
姓名 | 项目 |
---|---|
安 | 苹果 |
鲍勃 | 盐 |
distinct_data: ([] Name: `Ann`Bob; Item: `Apple`Salt)
然后我想根据 sales_data 将数据添加到distinct_data 表中,如下所示:
姓名 | 项目 | 购买数量 | 售出数量 | 加权平均购买价格 | 加权平均销售价格 |
---|---|---|---|---|---|
安 | 苹果 | 10 | 12 | 5 | 6 |
鲍勃 | 盐 | 11 | 2 | 1 | 2 |
我如何连接 sales_data 和distinct_data 表才能做到这一点?这是内连接的情况吗?
首先,您可以使用类似于 Terry 在上一个问题中给出的命令生成不同的数据,包括所有列:
q)data:select from sales_data where({all`Buy`Sell in x};Action)fby([]Name;Item)
Name Item Action Price Num_Items
---------------------------------
Ann Apple Buy 5 10
Ann Apple Sell 6 12
Bob Salt Buy 1 10
Bob Salt Buy 1 1
Bob Salt Sell 2 2
然后您可以根据需要聚合数据:
q)agg:select sum Num_Items, Num_Items wavg Price by Name,Item,Action from data
Name Item Action| Num_Items Price
-----------------| ---------------
Ann Apple Buy | 10 5
Ann Apple Sell | 12 6
Bob Salt Buy | 11 1
Bob Salt Sell | 2 2
并旋转以获得所需的输出。为了保持简单,我将创建 2 个数据透视表。
q)vol:`Name`Item`Num_Buy`Num_Sold xcol exec P#(Action!Num_Items) by Name,Item from agg
Name Item | Num_Buy Num_Sold
----------| ----------------
Ann Apple| 10 12
Bob Salt | 11 2
q)wag:`Name`Item`Weighted_Avg_Price_Bought`Weighted_Avg_Price_Sold xcol exec P#(Action!Price) by Name,Item from agg
Name Item | Weighted_Avg_Price_Bought Weighted_Avg_Price_Sold
----------| -------------------------------------------------
Ann Apple| 5 6
Bob Salt | 1 2
最后加入他们以给出所需的输出:
q)0!vol uj wag
Name Item Num_Buy Num_Sold Weighted_Avg_Price_Bought Weighted_Avg_Price_Sold
-----------------------------------------------------------------------------
Ann Apple 10 12 5 6
Bob Salt 11 2 1 2