基于CASE语句的算术运算

时间:2014-09-08 21:19:44

标签: sas proc-sql

我有一张Four Fields的表格。 ID,美元,指标和类型。

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的情况下添加所有美元,然后用每个ID指示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;

2 个答案:

答案 0 :(得分:2)

由于这是用SAS标记的,所以不确定这是否有用。

但是在SQL中,你需要在case语句中使用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声明只是更改了借记交易的美元金额符号,因此您可以在一个步骤中对所有内容求和。

答案 1 :(得分:2)

下面的代码应该可以胜任。您需要对变量求和,但如果您只想要净数字,则可以转储前两个语句。此外,使用dollar8格式将改善输出的外观。

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 ;