全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1403 3
2014-09-03
  • proc sql;
  • CREATE TABLE mysas.result as select id,
  • sum(T_visa) as total_visa,
  • sum(T_master) as total_master,
  • sum(T_pri) as total_pri,
  • sum(T_sec) as total_sec,
  • sum(T_limit) as total_limit
  • from mysas.temp Group by id;



SAS 显示,sum是for numeric, not char. 请问如何转换啊? 谢谢






数据
aggregation如下(请使用后面附上的dataset):
id   card_type    card_cat               card_limit
001    visa         primary                 3000
001    visa         supplementary      3500
001    master    supplementary      2000
002    master    primary                  5000
002    visa          primary                 4000
003    visa         supplementary      2000
004    master    supplementary      2500
card_type分别是visa卡和master卡,card_cat分别是主卡和附属卡,card_limit为信用额度。


题目要求: 将数据整合到一行数据只有一个唯一id,并计算:
total_visa:      有多少张visa卡

total_master:有多少张master

total_pri:       有多少张主卡

total_sec:      有多少张附属开

total_limit:     总共的信用额度


其结果如下:

                            id   total_visa  total_master  total_pri  total_sec  total_limit
                            ----------------------------------------------------------------
                            001           2             1          1          2         8500
                            002           1             1          2          0         9000
                            003           1             0          0          1         2000
                            004           0             1          0          1         2500
请写出实现的程序。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-9-3 16:14:15
data test;
   input id $4. card_type $10. card_cat $20. card_limit;
   cards;
001    visa         primary                 3000
001    visa         supplementary      3500
001    master    supplementary      2000
002    master    primary                  5000
002    visa          primary                 4000
003    visa         supplementary      2000
004    master    supplementary      2500
;

proc sql;
  create table want as
  select id,
         sum(case when card_type='visa' then 1 else 0 end) as total_visa,
                 sum(case when card_type='master' then 1 else 0 end)as total_master,
                 sum(case when card_cat='primary' then 1 else 0 end)as total_pri,
                 sum(case when card_cat='supplementary' then 1 else 0 end)as total_sec,
                 sum(card_limit) as total_limit
        from test
        group by id;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-9-3 21:29:57
thanks so much!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-9-9 11:33:23
data test;
   input id 4. cardtype $10. card_cat $20. card_limit;
   cards;
001    visa         primary                 3000
001    visa         supplementary      3500
001    master    supplementary      2000
002    master    primary                  5000
002    visa          primary                 4000
003    visa         supplementary      2000
004    master    supplementary      2500
;
proc sort data=test;by id ;run;
data want(drop=cardtype card_cat card_limit);
set test;
by id ;
retain total_visa  total_master  total_pri  total_sec  total_limit 0;
if first.id then do; total_visa=0; total_master=0; total_pri=0;total_sec=0;total_limit=0;end;
total_limit=sum(total_limit, card_limit);
if cardtype='visa' then total_visa+1;else if cardtype='master' then total_master+1;
if card_cat='primary' then total_pri+1; else if card_cat='supplementary' then total_sec+1;
if last.id then output want;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群