我有一张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;
答案 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 ;