Когда q интерпретирует x, он будет обрабатывать его как строку, он не имеет ссылки на столбец, поэтому ваш вывод будет просто считать "HEADER".
Если вы хотите передать столбец в виде строки, вам нужно построить весь оператор выбора, а затем использовать значение
{value "select count ",x," from tab"} "HEADER"
Однако рекомендуемый метод будетчтобы использовать , выберите .Ниже я использую parse для построения эквивалента функционального выбора, используя дерево разбора.
/Create sample table
tab:([]inst:10?`MSFT`GOOG`AAPL;time:10?.z.p;price:10?10f)
/Generate my parse tree to get my functional form
.Q.s parse "select count i by inst from tab"
/Build this into my function
{?[`tab;();(enlist x)!enlist x;(enlist `countDistinct)!enlist (#:;`i)]} `inst
Обратите внимание, что вы должны передать столбец как символ.Кроме того, #: i является просто k-эквивалентом для подсчета i.
Обновление для нескольких столбцов
tab:([]inst:10?`MSFT`GOOG`AAPL;time:10?.z.p;price:10?10f;cntr:10`HK`SG`UK`US)
{?[`tab;();(x)!x;(enlist `countDistinct)!enlist (#:;`i)]} `inst`cntr