本文假定读者对SQL很熟悉,因此不涉及SQL本身,只针对SQL在SAS中的应用
proc sql语法如下:
SQL STATEMENT;
..
<quit;>
常见选项
下面说的选项是指<options(s)里的选项>
FEEDBACK选项
它是在<option(s)>里的一个选项,可选值为 FEEDBACK | NOFEEDBACK
默认值是NOFEEDBACK,如果加上了FEEDBACK, 则会在SAS LOG中显示解析后的SQL(比如select *会解析为select所有字段)。
示例如下:
10221
10222 proc sql feedback;
10223 select * from certadv.payrollmaster
10224 where salary<32000
10225 order by jobcode;
NOTE: 语句变换为:
select PAYROLLMASTER.EmpID, PAYROLLMASTER.JobCode, PAYROLLMASTER.Salary, PAYROLLMASTER.DateOfBirth, PAYROLLMASTER.DateOfHire
from CERTADV.PAYROLLMASTER
where PAYROLLMASTER.Salary < 32000
order by PAYROLLMASTER.JobCode asc;
10226 quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 0.11 秒
CPU 时间 0.03 秒
INOBS=和OUTOBS=
INOBS=n表示只从数据集中读取n行来处理,OUTOBS=n表示只展示n行。
NUMBER选项
加上此选项后,会在结果中多显示第1列,列名为row,记录号从1开始。示例程序:
proc sql number inobs=5;
select *
from sashelp.class
;
quit;
输出如下:
NOEXEC选项
如果指定这个选项,那么SQL不会执行,只会在SAS LOG中显示一条NOTE: 由于 NOEXEC 选项,未执行语句。
如果SQL中有错误,那么会在SAS中将错误展示出来。
(注:也可以在SELECT语句前指定validate,效果类似)
calculated关健字
正常SQL情况下,计算出来的值不能出现在Where条件中,比如下面的SQL会报语法错误
select col1, col2, col1+col2 as total from t1 where total < 100;
这时候需要用到在列名前加上calculated关键字,表示这个列不是原表中有的,而是计算出来的列,改成如下SQL即可:
select col1, col2, col1+col2 as total from t1 where calculated total < 100;
IS MISSING
IS MINSSING和IS NULL等价,可以用IS NULL的地方都可以改为IS MISSING
SUM(COL1, COL2)
上面的表达式在标准SQL中是不支持的,因为sum()在标准SQL中是一个聚合函数。比如支持sum(col1),或者sum(col1+col2).
但同时sum还是SAS中的函数,所以在SAS中,上面的方式也是支持的,它计算每一行的col1+col2,形成一个新的列,程序示例:
select * from t1;
select *, sum(col1,col2) as col1_2 from t1;
select *,sum(col1+col2) as col1_2 from t1;
输出如下:
给列设定format
比如 select avg(salary) as avgsalary from payroll; 则默认的avgsalary不是dollarw.格式的, 如果想在输出中改为这种格式,可以使用如下SQL:
select avg(salary) as avgsalary format=dolloar12. from payroll;
HAVING子句
HAVING一般跟在GROUP后面,只展示满足HAVING条件的组,比如查询选修了3门以上课程的学生的学号:
select Sno from SC group by Sno having count(*) > 3;
HAVING和WHERE区别在于作用对象的不同。 WHERE子句基本表或视力,从中选择满足条件的记录。而HAVING作用于组,从中选择慢足条件的组。