全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1389 3
2019-03-23
1.原数据: (⊙﹏⊙)绕太阳.png
2.想要将原数据转换成如下:

士大夫v.png
3.已编辑了code


DATA PROJECT1.BILLING_Jan_Dec;
SET WORK.SORTED_BILLING_ACCOUNTS;
BY BILLING_ACCOUNT;

RETAIN BILL_JAN  BILL_FEB  BILL_MAR  BILL_APR  BILL_MAY BILL_JUN BILL_JUL BILL_AUG BILL_SEP BILL_OCT BILL_NOV BILL_DEC;

if BILLING_ACCOUNT = 1 then do;
BILL_JAN =0;
BILL_FEB =0;
BILL_MAR =0;
BILL_APR =0;
BILL_MAY =0;
BILL_JUN =0;
BILL_JUN =0;
BILL_JUL =0;
BILL_AUG =0;
BILL_SEP =0;
BILL_OCT =0;
BILL_NOV =0;
BILL_DEC =0;
end;

IF BILL_MTH = '1JAN2011'D THEN DO;
        BILL_JAN = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1FEB2011'D THEN DO;
        BILL_FEB = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1MAR2011'D THEN DO;
        BILL_MAR = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1APR2011'D THEN DO;
        BILL_APR = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1MAY2011'D THEN DO;
        BILL_MAY = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH ='1JUN2011'D THEN DO;
        BILL_JUN = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1JUL2011'D THEN DO;
        BILL_JUL = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1AUG2011'D THEN DO;
        BILL_AUG = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1SEP2011'D THEN DO;
        BILL_SEP = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1OCT2011'D THEN DO;
        BILL_OCT = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1NOV2011'D THEN DO;
        BILL_NOV = AMOUNT_TOPAY;
        END;
ELSE IF BILL_MTH = '1DEC2011'D THEN DO;
        BILL_DEC = AMOUNT_TOPAY;
        END;

IF LAST.BILLING_ACCOUNT = 1 THEN OUTPUT;

DROP BILL_MTH AMOUNT_TOPAY CREDIT_ADJ CURRENT_BILL_AMT LAST_BILL_AMT OUTSTANDING PAYMENT ROUNDING_AMT;
RUN;
4.结果和问题:

program出现了一个小感叹号
234.png
请问为什么会出现这种情况?代码我需要如何更改?
附件列表
234.png

原图尺寸 177.58 KB

234.png

二维码

扫码加我 拉你入群

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

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

全部回复
2019-3-23 14:19:35
我也不会,不过支持一下
二维码

扫码加我 拉你入群

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

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

2019-3-26 03:17:17
你用了BY BILLING_ACCOUNT, data set 也写的是SORTED_BILLING_ACCOUNTS,但是贴的图data set BILLING_ACCOUNTS 是unsorted. 另外用ARRAY可以大大简化程序。如果我来写code, 会是这样的:
DATA PROJECT1.BILLING_Jan_Dec;
SET WORK.SORTED_BILLING_ACCOUNTS;
BY BILLING_ACCOUNT;
RETAIN  BillJan BillFeb BillMar BillApr BillMay BillJun BillJul BillAug BillSep BillOct BillNov BillDec 0;
array BillMTH (12) $7 ('2011JAN' '2011FEB' '2011MAR' '2011APR' '2011MAY' '2011JUN' '2011JUL' '2011AUG' '2011SEP' '2011OCT' '2011NOV' '2011DEC');
array BillMonth (12) BillJan BillFeb BillMar BillApr BillMay BillJun BillJul BillAug BillSep BillOct BillNov BillDec;
   do i=1 to 12;
            if Bill_MTH= BillMTH (i) then BillMonth(i)=AMOUNT_TOPAY;
   end;
drop i Bill_MTH AMOUNT_TOPAY BillMTH1-BillMTH12;
if last.BILLING_ACCOUNT;
RUN;
二维码

扫码加我 拉你入群

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

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

2019-3-26 04:55:38
xiaopingN 发表于 2019-3-26 03:17
你用了BY BILLING_ACCOUNT, data set 也写的是SORTED_BILLING_ACCOUNTS,但是贴的图data set BILLING_ACCO ...
当然最简单的办法是用proc transpose。
proc transpose data=work.SORTED_BILLING_ACCOUNTS  out=PROJECT1.BILLING_Jan_Dec(rename=(col1=BillJan col2=BillFeb col3=BillMar col4=BillApr col5=BillMay col6=BillJun col7=BillJul col8=BillAug
col9=BillSep col10=BillOct col11=BillNov col12=BillDec)) Name=BILLING_ACCOUNT;
var AMOUNT_TOPAY;
by BILLING_ACCOUNT;
run;


二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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