计数变量(大)列数的标志

时间:2015-07-02 09:32:46

标签: mysql sql oracle postgresql sas

我有一张如下表:http://i.stack.imgur.com/EyKt3.png

我想得到这样的结果:

Conditon    COL
ted1        4
ted2        1
ted3        2

即,' 1'的数量。只有在这种情况下。

我想知道总数没有。仅限1(查看表格),忽略0。如果条件为真(1)则计算+1。

还要考虑:如果许多列会怎么样?我想避免为每一个输入表达式,例如ted1ted80

3 个答案:

答案 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。

这适用于 任何表,其中任何列匹配任何模式,只要所选列是所有数字或全部布尔值。只计算值1true)。

创建此功能一次

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模式。因此,通配符%

SQL Fiddle.

相关答案以及更多解释: