2014-09-08 2 views
1

У меня есть таблица с четырьмя полями, а именно: ID, доллар, индикатор и тип.Арифметическая операция, основанная на заявлении CASE

ID | Dollar | Indicator | Type 

1 | 30 | 1   | A 

1 | 20 | 1   | A 

1 | 60 | 0   | A 

1 | 34 | 1   | B 

1 | 23 | 0   | B 

1 | 45 | 0   | B 

2 | 20 | 1   | A 

2 | 20 | 0   | A 

Теперь я хочу добавить все доллары, где индикатор равен 1, а затем вычесть их долларом с индикатором 0 для каждого идентификатора. Также в некоторых случаях они также должны быть сгруппированы по типу.

Я использовал следующий код, но, похоже, не дает правильного ответа.

proc sql; 
    select ID,Type, 
    case when Indicator = '1' then sum(Dollar) else 0 end as Credit, 
    case when Indicator = '0' then sum(Dollar) else 0 end as Debit 
    from test 
    group by ID,Type 
    ; 
quit; 

proc sql; 
    select ID,Type, (Credit - Debit) as Trans 
    from test 
    group by Id, Type 
    ; 
quit; 
+0

Хорошая вещь, чтобы помнить с группой по: все должно быть группой по переменной или реферирования (сумма, среднее, граф, макс, мин и т.д.) в качестве _first_ части определения столбца. – Joe

ответ

2

Поскольку это отмечено как SAS, поэтому не уверен, что это поможет.

Но в вашем SQL вы должны использовать SUM на сазе, а не наоборот:

select 
    ID, 
    Type, 
    sum(case when Indicator = '1' then Dollar else 0 end) as Credit, 
    sum(case when Indicator = '0' then Dollar else 0 end) as Debit 
from 
    test 
group by 
    ID, 
    Type 
; 

А потом сделать свою вторую операцию.

Однако вы можете сделать все это в одном операторе SQL:

select 
    id, 
    type, 
    sum(case indicator when 1 then dollar else -1*dollar end) as net_dollar 
from 
    temp 
group by 
    id, 
    type 

CASE заявления здесь просто меняет знак доллара суммы для дебетовых транзакций, так, то вы можете суммировать все в одном шаге ,

+0

Работает аналогично в SQL SAS. – Joe

2

Ниже код должен выполнять эту работу. Вам нужно суммировать переменные, хотя, если вам нужна только чистая цифра, вы можете сбросить первые 2 case-заявления. Кроме того, использование формата доллара8 улучшит внешний вид вашего продукта.

proc sql ; 
    create table output as 
    select id, type, 
    sum(case when Indicator = '1' then Dollar else 0 end) as Credit format dollar8., 
    sum(case when Indicator = '0' then Dollar else 0 end) as Debit format dollar8., 
    sum(case when Indicator = '1' then Dollar else -1*Dollar end) as Trans format dollar8. 
    from Test 
    group by 1, 2 
    ; 
quit ; 
Смежные вопросы