根据Proc Sql,SAS中的条件将列拆分为两个

时间:2018-05-08 05:53:44

标签: sas proc-sql

我想将航空公司专栏分成两组然后  为所有客户添加每组的金额......: -

第1组= Air India&喷气式飞机      |第2组=其他。

Loc  Client_Name     Airlines           Amout
BBI   A_1ABC2        Air India          41302
BBI   A  1ABC2       Air India          41302
MAA   Th 1ABC2       Spice Jet Airlines 288713
HYD   Ma 1ABC2       Jet Airways        365667
BOM   Vi 1ABC2       Air India          552506

这样的事情: -

Rank    Client_name Group1  Group2  Total   
1       Ca 1ABC2    5266269 7040320 1230658 
2       Ve 1ABC2    2815593 2675886 5491479 
3       Ma 1ABC2    1286686 437843  1724529 
4       Th 1ABC2    723268  701712  1424980 
5       Ec 1ABC2    113517  627734  741251  
6       A  1ABC2    152804  439381  592185  

我先将它分组..但我对如何拆分感到困惑: -

Data assign6.Airlines_grouping1;
Set assign6.Airlines_grouping;

if Scan(Airlines,1) IN ('Air','Jet') then Group = "Group1";
else
if Scan(Airlines,1) Not in('Air','Jet') then Group = "Group2";

Run;

1 个答案:

答案 0 :(得分:3)

您正在根据航空公司的第一个单词对行进行分类。

带有Proc TRANSPOSE语句的

ID是重塑数据的一种常用方法,以便分类值成为列。第二种方法是绕过分类并使用数据步骤直接生成新的数据形状。

以下是第二种方式的示例 - 创建新列group1和group2并根据航空公司标准设置值。

data airlines_group_amounts;
  set airlines;

  if scan (airlines,1) in ('Air', 'Jet') then
    group1 = amount;
  else
    group2 = amount;
run;

总结客户

proc sql;
  create table want as
  select
    client_name
  , sum(group1) as group1
  , sum(group2) as group2
  , sum(amount) as total
  from airlines_group_amounts
  group by client_name
;

您可以避免这两个步骤并在单个查询中执行所有处理,或者您可以使用Proc MEANS进行摘要

这是一种查询方式。

proc sql;
  create table want as
  select
    client_name
  , sum(case when scan (airlines,1) in ('Air', 'Jet') then amount else 0 end) as group1
  , sum(case when scan (airlines,1) in ('Air', 'Jet') then 0 else amount end) as group2
  , sum(amount) as total
  from airlines
  group by client_name
;