问题描述
我有2个具有相同列的表。但是,一个表包含BUY数据,而另一个表包含SELL数据。该表的第一列是ID,并且表的行数可能不同。 如果ID的值相同,如何在2个表中添加列的值?例如,我要添加tableA和tableB,输出为tableC
tableA tableB
ID Qty ID Qty
ABC 100 ABC 90
XZY 100 TOM 60
TOM 100 ROB 40
AL 100
tableC
ID Qty
ABC 190
XYZ 100
TOM 160
AL 100
ROB 40
解决方法
在这种情况下,您可以使用pj。要使用pj,必须对表进行键控以使联接起作用,并且返回的结果将包括与键控表匹配的行。请参阅文章底部的链接。
x++
在查询中,您需要包括两个表中的所有行,因此您需要创建一个包含所有ID的机架,并在两个表中应用pj来将它们添加在一起。见下文。
q)tabA:([]ID:`ABC`XYZ`TOM`AL;Qty:100 100 100 100)
q)tabB:([]`ID`ABC`TOM`ROB;Qty:90 60 40 )
q)tabA pj 1!tabB
ID Qty
-------
ABC 190
XYZ 100
TOM 160
AL 100
q)tabB pj 1!tabA
ID Qty
-------
ABC 190
TOM 160
ROB 40
另一种解决方法是:
(pj/)((select distinct ID from tabA,select distinct from tabB);`ID xkey tabA;`ID xkey tabB)
,
您可以使用加号联接添加用于匹配ID的表,然后联接表B中与联合联接或简单逗号联接不匹配的ID
q)tableA:([]ID:`ABC`XZY`TOM`AL;Qty:100 100 100 100)
q)tableB:([]ID:`ABC`TOM`ROB;Qty:90 60 40)
q)(tableA pj 1!tableB),select from tableB where not ID in tableA`ID
,
一种替代方法是将表转换为字典并添加它们。字典似乎是这些表的更自然的结构,因为您将它们描述为键值对:
q)dA:`ABC`XZY`TOM`AL!100 100 100 100
q)dB:`ABC`TOM`ROB!90 60 40
q)dA+dB
ABC| 190
XZY| 100
TOM| 160
AL | 100
ROB| 40