当人们做select Count:count i by Id,sym from T
之类的事情时,我们当然会得到一个简单的键控表,如下所示:
t1:`Id`sym xkey ([]Id:`A`A`B`B;sym:`sym1`sym2`sym2`sym3;Count:3 4 8 8)
请注意,(Id=`A, sym=`sym3)
或(Id=`b,sym=`sym2)
没有条目。在我的制表中,我想包括这些空组合,其中计数用0填充。输出应该是这样的:
t2:`Id`sym xkey([]Id:`A`A`A`B`B`B;sym:`sym1`sym2`sym3`sym1`sym2`sym3;Count:3 4 0 0 8 8)
最干净的方法吗?
答案 0 :(得分:2)
有几种方法可以做到这一点:
q)0^((select distinct Id from t1) cross select distinct sym from t1)#t1
Id sym | Count
-------| -----
A sym1| 3
A sym2| 4
A sym3| 0
B sym1| 0
B sym2| 8
B sym3| 8
或(基本上是同一件事)
q)0^2!lj[;t1] (select distinct Id from t1) cross select distinct sym from t1
Id sym | Count
-------| -----
A sym1| 3
A sym2| 4
A sym3| 0
B sym1| 0
B sym2| 8
B sym3| 8
注意 - 如果Count是唯一的未键控列,则“零填充”仅适用于此处。否则你必须进行更新0 ^从表中计数
答案 1 :(得分:1)
与@terrylynch相同的方法,但只是在你的t1有多个键列的情况下稍微更通用
q)t:([]id:10?3; sym:10?`a`b`c; val:10?1.)
q)k xasc 0^(flip k!flip (cross) . distinct each t k:keys tg)#tg:select ct:count i by id, sym from t
id sym| ct
------| --
0 a | 0
0 b | 1
0 c | 2
1 a | 1
1 b | 2
1 c | 0
2 a | 1
2 b | 1
2 c | 2