本文假定读者对SQL很熟悉,因此不涉及SQL本身,只针对SQL在SAS中的应用
proc sql语法如下:
PROC SQL
SQL STATEMENT;
..
下面说的选项是指
它是在
默认值是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=n表示只从数据集中读取n行来处理,OUTOBS=n表示只展示n行。
加上此选项后,会在结果中多显示第1列,列名为row,记录号从1开始。示例程序:
proc sql number inobs=5;
select *
from sashelp.class
;
quit;
输出如下:
如果指定这个选项,那么SQL不会执行,只会在SAS LOG中显示一条NOTE: 由于 NOEXEC 选项,未执行语句。
如果SQL中有错误,那么会在SAS中将错误展示出来。
(注:也可以在SELECT语句前指定validate,效果类似)
正常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 MINSSING和IS NULL等价,可以用IS NULL的地方都可以改为IS MISSING
在DB2数据库中,如果使用SUM(COL1, COL2)那么计算结果只有一行,它相当于sum(col1)+sum(col2)
但在SAS中,它是为每一行返回一条结果,只计算当前行中的col1+col2。
比如 select avg(salary) as avgsalary from payroll; 则默认的avgsalary不是dollarw.格式的, 如果想在输出中改为这种格式,可以使用如下SQL:
select avg(salary) as avgsalary format=dolloar12. from payroll;
HAVING一般跟在GROUP后面,只展示满足HAVING条件的组,比如查询选修了3门以上课程的学生的学号:
select Sno from SC group by Sno having count(*) > 3;
HAVING和WHERE区别在于作用对象的不同。 WHERE子句基本表或视力,从中选择满足条件的记录。而HAVING作用于组,从中选择慢足条件的组。