2016-12-01 2 views
0

У меня есть следующий код:Сумма SAS/SQL суммирует отчетливо для каждой группы по объекту?

proc sql; 
CREATE TABLE temp AS 
(SELECT asofdt, 
     SUM(CASE WHEN trans_state ='cur_cur' THEN 1 ELSE 0 END) AS _cur_cur, 
     SUM(CASE WHEN trans_state ='cur_worse' THEN 1 ELSE 0 END) AS _cur_worse, 
     SUM(CASE WHEN trans_state ='cur_pre' THEN 1 ELSE 0 END) AS _cur_pre, 
     SUM(CASE WHEN trans_state ='30_better' THEN 1 ELSE 0 END) AS _30_better, 
     SUM(CASE WHEN trans_state ='30_30' THEN 1 ELSE 0 END) AS _30_30, 
     SUM(CASE WHEN trans_state ='60_90' THEN 1 ELSE 0 END) AS _60_90 
FROM PERFORMANCE_TRANS_STATES_CLEAN 
GROUP BY asofdt); 
run; 

Проблема заключается в том, что добавляет значение из предыдущей группы по asofdt на следующий. Так что это совокупная сумма, когда я спускаюсь по группе. Я хотел бы, чтобы сумма была конкретной для каждой группы по объекту. Любые идеи о том, как?

Вот фотография моего вывода.

enter image description here

ответ

1

Ваша программа кажется мне прекрасной. Я воспроизвел его ниже с меньшим количеством наблюдений и не обнаружил, что сумма была кумулятивной.

data df; 
input asofdt MMDDYY8. trans_state $; 
datalines; 
01/01/16 cur_cur 
01/02/16 cur_pre 
01/02/16 cur_pre 
01/02/16 cur_cur 
01/03/16 cur_pre 
; 
run; 

proc sql; 
CREATE TABLE temp AS 
(SELECT asofdt, 
     SUM(CASE WHEN trans_state ='cur_cur' THEN 1 ELSE 0 END) AS _cur_cur, 
     SUM(CASE WHEN trans_state ='cur_worse' THEN 1 ELSE 0 END) AS _cur_worse, 
     SUM(CASE WHEN trans_state ='cur_pre' THEN 1 ELSE 0 END) AS _cur_pre, 
     SUM(CASE WHEN trans_state ='30_better' THEN 1 ELSE 0 END) AS _30_better, 
     SUM(CASE WHEN trans_state ='30_30' THEN 1 ELSE 0 END) AS _30_30, 
     SUM(CASE WHEN trans_state ='60_90' THEN 1 ELSE 0 END) AS _60_90 
FROM df 
GROUP BY asofdt); 
quit; 

enter image description here

+1

Да, это была проблема с данными. Устойчивое развитие - это то, что меня отбросило. –

1

Вы можете проверить свои данные, так как этот запрос в порядке. Это действительно работает отдельно на каждом ASOFDT. Вы можете проверить это тривиально, сравнивая одну строку с WHERE (WHERE ASOFDT='01OCT2016'd или WHERE ASOFDT='10/01/2016' в зависимости от типа этой переменной).

proc sql; 
CREATE TABLE temp AS 
(SELECT stock, 
     SUM(CASE WHEN month(date)=01 THEN 1 ELSE 0 END) AS _jan, 
     SUM(CASE WHEN month(date)=02 THEN 1 ELSE 0 END) AS _feb, 
     SUM(CASE WHEN month(date)=03 THEN 1 ELSE 0 END) AS _mar, 
     SUM(CASE WHEN month(date)=04 THEN 1 ELSE 0 END) AS _apr 
FROM sashelp.stocks 
GROUP BY stock); 
quit; 

Ничего об этом не должно быть кумулятивным. Если ваши данные не являются кумулятивными, какие из них имеют смысл, то это будет с «ASOFDT»?

+0

Да, это было на самом деле вопрос о данных. Устойчивое развитие - это то, что меня отбросило. –

Смежные вопросы