首页 > 解决方案 > 使用 proc sql 对数据集进行多次求和

问题描述

我的数据

data mydata;
input 
Category $ 
Item 
type
amount;
datalines;
A  1 100 11111
A  2 900 11111
A  3 123 11111
B  1 113 11111
B  2 900 11111
C  1 111 11111
C  2 900 11111
;

我的尝试

proc sql;
create table want as 
    select *, sum(amount and item <> 900) as without900, sum(amount) as total from mydata       
group by category
;
quit;

结果

Category    Item    type    amount  without900  total  
  A          3       123     11111       3      33333
  A          1       100     11111       3      33333
  A          2       900     11111       3      33333
  B          2       900     11111       2      22222
  B          1       113     11111       2      11111
  C          2       900     11111       2      11111
  C          1       111     11111       2      11111

预期结果

Category    Item    type    amount  without900  total  
  A          3       123     11111    22222     33333
  A          1       100     11111    22222     33333
  A          2       900     11111    22222     33333
  B          2       900     11111    11111     22222
  B          1       113     11111    11111     11111
  C          2       900     11111    11111     11111
  C          1       111     11111    11111     11111

我知道这可以通过创建另一个表并因此使用左连接来轻松实现。我想知道如何使用尽可能少的 proc SQL 步骤来实现预期。非常感谢。

标签: sas

解决方案


你在比较item900什么时候应该比较type。条件和可以使用其中的case子句来完成。

例子

data mydata;
  input Category $ Item type amount;
datalines;
A  1 100 11111
A  2 900 11111
A  3 123 11111
B  1 113 11111
B  2 900 11111
C  1 111 11111
C  2 900 11111
;

proc sql;
  create table want as 
  select 
    *
    , sum(case when type ne 900 then amount end) as without900
    , sum(amount) as total
  from 
    mydata       
  group by 
    category
;
quit;

推荐阅读