1

我有一张有四个字段的表格,即。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;
4

2 回答 2

2

下面的代码应该可以完成这项工作。您需要对变量求和,但如果您只想要净数字,您可以转储前 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 ;
于 2014-09-09T09:18:04.493 回答
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语句只是更改借方交易的美元金额的符号,因此您可以在一个步骤中汇总所有内容。

于 2014-09-09T00:09:05.140 回答