我有一张如下表:http://i.stack.imgur.com/EyKt3.png
我想得到这样的结果:
Conditon COL
ted1 4
ted2 1
ted3 2
即,' 1'的数量。只有在这种情况下。
我想知道总数没有。仅限1(查看表格),忽略0。如果条件为真(1)则计算+1。
还要考虑:如果许多列会怎么样?我想避免为每一个输入表达式,例如ted1
到ted80
。
答案 0 :(得分:1)
使用proc means
是最有效的方法:
proc means data=have noprint;
var ted:; *captures anything that starts with Ted;
output out=want sum =;
run;
proc print data=want;
run;
答案 1 :(得分:0)
试试这个
select
sum(case when ted1=1 then 1 else 0 end) as ted1,
sum(case when ted2=1 then 1 else 0 end) as ted2,
sum(case when ted3=1 then 1 else 0 end) as ted3
from table
答案 2 :(得分:0)
在 PostgreSQL (使用版本 9.4 进行测试)中,您可以使用LATERAL
VALUES
表达式进行反转轴。您需要动态SQL。
这适用于 任何表,其中任何列匹配任何模式,只要所选列是所有数字或全部布尔值。只计算值1
(true
)。
创建此功能一次:
CREATE OR REPLACE FUNCTION f_tagcount(_tbl regclass, col_pattern text)
RETURNS TABLE (tag text, tag_ct bigint) AS
$func$
BEGIN
RETURN QUERY EXECUTE (
SELECT
'SELECT l.tag, count(l.val::int = 1 OR NULL)
FROM ' || _tbl || ', LATERAL (VALUES '
|| string_agg( format('(%1$L, %1$I)', attname), ', ')
|| ') l(tag, val)
GROUP BY 1
ORDER BY 1'
FROM pg_catalog.pg_attribute
WHERE attrelid = _tbl
AND attname LIKE col_pattern
AND attnum > 0
AND NOT attisdropped
);
END
$func$ LANGUAGE plpgsql;
呼叫:
SELECT * FROM f_tagcount('tbl', 'ted%');
结果:
tag | tag_ct
-----+-------
ted1 | 4
ted2 | 1
ted3 | 2
第一个参数是一个有效的表名,可能是模式限定的。针对SQL注入的防御内置于数据类型regclass
。
第二个参数是列名的LIKE
模式。因此,通配符%
。
相关答案以及更多解释: