Q0.SAS和SAS eg的帮助文档,可以解决90%问题
Q1.平时经常使用的宏变量
A1.定义方法有三种:
%let xxx=yyy;
Call Symput(‘xxx’,‘yyy’);
select xxx into: yyy.
三种定义方式最大的区别是在MACRO函数内定义所生成的宏变量的类型不同:
Call Symput在宏函数中定义的宏变量可以在函数外调用;而%let和 Select into则不能,因为这2种方法在MACRO函数内生成的是局部宏变量,若要想在MACRO函数外调用,需事先用%global申明变量类型。
%macro test();
/*Method 1*/
data _NULL_;
call symput('Today',put(today(),date9.));
run;
/*Method 2*/
%let today=%sysfunc(today(),date9.);
/*Method 3*/
data todaydate;
date=today();
Proc sql noprint;
select put(date,date9.) INTO: today
from todaydate;
quit;
%put &today;
%mend;
%test;
%put &today;
来自https://zhidao.baidu.com/question/1642728095170651860.html
Q2.用bat执行sas文件不成功
A2.bat文件执行条件:
1.不能加密
2.同一条语句不能换行
"D:\Program Files\SASHome2\SASFoundation\9.4\sas.exe" -sysin "C:\Users\**\Desktop\SAS脚本\每日自动\贷前客户画像.sas" -log "C:\Users\**\Desktop\SAS脚本\每日自动\贷前客户画像.log" -CONFIG "D:\Program Files\SASHome2\SASFoundation\9.4\nls\zh\sasv9.cfg"
3.一个bat调用多个bat
start C:\Users\**\Desktop\SAS脚本\每日自动\111.bat exit
start C:\Users\**\Desktop\SAS脚本\每日自动\222.bat exit
start C:\Users\**\Desktop\SAS脚本\每日自动\333.bat exit
Q3.ERROR: 值“ ”是无效的 SAS 名。不识别中文变量名
A3.解决方案:options validvarname=any;
Q4.WARNING: 连接逻辑库“SASHELP”中指定的一个或多个逻辑库不存在。这些逻辑库已从连
WARNING: 接中删除。
A4.解决方案:新建文件夹SASCFG 建立路径如下:
盘:\SASHome\x86\SASFoundation\9.4\nls\en
盘:\SASHome\x86\SASFoundation\9.4\nls\zh
建立后结果:
盘:\SASHOME\x86\SASFoundation\9.4\nls\en\SASCFG
盘:\SASHOME\x86\SASFoundation\9.4\nls\zh\SASCFG
来自 https://bbs.pinggu.org/thread-5896458-1-1.html
Q5.ERROR: 执行错误: Data too long for column ‘发放季度’ at row 1
A5.解决方案1:在SAS中新建一个满足column '发放季度’字段长度的表,再将其复制到mysql中
解决方案2:LENGTH
DATA month_fir_ovd;
LENGTH '发放季度’n $ 500;
SET month_fir_ovd;
RUN;
Q6.ERROR: 字符表达式要求字符输出格式。
A6.解决方案1:INPUT(SUBSTR(createdate,1,10),YYMMDD10.) FORMAT YYMMDD10. AS 执行日期,FORMAT在 AS 前还是后都可以
解决方案2:time=input(put(date,yymmn6.),yymmn6.)
Q7.日期互换
A7.PUT(dd_date,YYMMN6.) accdate=INPUT(accdate,YYMMDD10.) INPUT(substr(accdate,1,10),yymmdd10.)/用这个,也不一定行/ INPUT(SUBSTR(app_num,3,8),yymmdd10.)
PUT(A.create_time,YYMMDDN8.) 为YYYYMMDD
INPUT(STERM, BEST.)文本转数值
Q8.ERROR: 日期值越界
A8.需要加上DATEPART()
Q9.给代码加注释
Q9.良好的代码习惯
*---------------------------------------------------*
| PURPOSE: ***
| PROGRAMMER: abc
| DATE: 2019-08-26
| REMARK:
|
*---------------------------------------------------*;
分段
*------------------------------------------------------------------------------------------------------*
/*1.*************************;
*------------------------------------------------------------------------------------------------------*;
Q10.week周函数
A10.weeku=week(date,“u”),表示把每周的Sunday当作一周的开始,并且新一年的前几天和上一年在同一周,则新一年前几天按照0周看待,上一年的后几天当作52周;
weekv=week(date,“v”),表示把每周的Monday当作一周的开始,并且新一年的前几天和上一年在同一周,则新一年前几天和上一年的后几天当作53周;
weekw=week(date,“w”),表示把每周的Monday当作一周的开始,并且新一年的前几天和上一年在同一周,则新一年前几天按照0周看待,上一年的后几天当作52周;
Q11.添加序号
A11._N _
Q12.TRANSPOSE转置/固定符号拆分
A12.双ID作为字段名
PROC TRANSPOSE DATA=上下限_20181116_汇总 OUT=上下限_20181116_汇总 delimiter=_;
BY 业务品种 业务类型 客户类型 客户评级 机构 版本;
VAR COL1;
ID 借款主体 _NAME_;
RUN;
/*固定符号拆分*/
proc transpose data=risk_all out=spec_risk_1 prefix=spec_risk;
by app_num;
var spec_risk;
data spec_risk;
set spec_risk_1;
spec_risk=catx('@',of spec_risk1-spec_risk6);
run;
Q13.太慢
建立索引
PROC SQL;
create unique index studentID on class(studentID);
quit;
PROC SQL;
create index app_num on zrb_tag(app_num);
quit;
Q14.scan(string,i,“char”)
A14.表示从字串string中以char为分隔符提取第i个字串,eg:scan(‘2011-09-01 14:20:31’,1,’ '),
Q15.报错终止程序
A15.
%if &SYSERR > 6 %then %goto STOPLOG
Q16.SAS数据集取前N条记录
A16.
proc sql outobs=n