2015-07-02 2 views
-7

У меня есть таблица, которая выглядит следующим образом: http://i.stack.imgur.com/EyKt3.pngграф флагов для переменных (больших) чисел colums

И я хочу результат, как эти:

Conditon COL 
ted1  4 
ted2  1 
ted3  2 

т.е. подсчет количества '1' только в этом случае.

Я хочу знать общее количество нет. только 1 (проверьте таблицу), пренебрегая 0. Это похоже на то, что условие истинно (1), а затем count +1.

Также учитывайте: что, если есть много столбцов? Я хочу избежать ввода выражений для каждого из них, например, в этом случае ted1 - ted80.

+0

MySQL или Oracle? (Различные продукты, с разными версиями SQL.) И почему тег sas? – jarlh

+0

im работает над sas, а также proc sql в SAS, поэтому я подумал, что если кто-то может предоставить ответ в любом случае, будет отлично – 1SS2290

+0

«StackOverflow» Разрешает только 5 тегов – 1SS2290

ответ

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 
+0

Что делать, если у меня есть 10-20 переменных, т. Е. Ted1-Ted20 – 1SS2290

+0

Возможно, вам придется повторить это для всех столбцов или использовать PIVOT – Madhivanan

+0

, повторяющийся для всех столбцов, не является параметром, потому что у меня может быть до 80 столбцов для таблицы, так что – 1SS2290

0

В PostgreSQL (проверено с версией 9.4 ) вы можете Встречный поворот с выражением в LATERALVALUES. Вам понадобится динамический 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 
  • 1-ый аргумент действительное имя таблицы, поз сильная схема. Защита от SQL-инъекции встроена в тип данных regclass.

  • Второй аргумент - это шаблон LIKE для названий столбцов. Отсюда подстановочный знак %.

SQL Fiddle.

Связанные ответы с более подробного объяснения:

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; 
Смежные вопросы