SAS 中 PROC SQL过程步详解 - Go语言中文社区

SAS 中 PROC SQL过程步详解


SQL(Structured Query Language),在SAS中可以通过调用过程步 PROC SQL 使用。


NOPRINT: 使用SELECT语句查询时,SQL过程通常会在输出窗口输出数据,使用NOPRINT选项可以阻止输出。

DISTINCT: 剔除查询结果中重复的观测。select distinct  column_name  from  able_name。

SELECT: SQL过程中最常用的语句,通常后跟FROM。

ORDER BY: 对数据进行排序,其效果等同于SORT BY,可以全等替代。

DISCRIBE: 描述一个数据集或数据表的变量名及属性。describe table table_name。类似作用的还有proc contents data=dataset; 

QUIT: PROC SQL语句通常在遇到QUIT时停止,但如果没有QUIT,则在遇到下一个DATA步或PROC步时停止。


PROC SQL语句与MERGE语句的对比,有如下两表:

中国队
level china
0 c01
1 c02
2 c03
3 c04

美国队
level usa  
1 u00
2 u01
2 u02
3 u03
4 u04

使用merge时:

data pingpang;
merge resdat.China resdat.USA;
run;

#output
level    china   usa
1        c01     u00
2        c02     u01
2        c03     u02
3        c04     u03
4                u04

merge后接数据集名,在merge中,如果china与usa变量名相同,则以usa为准覆盖china的变量。而如果不同,则像上例一样,依旧以usa为准,依次连接china。


使用SQL时:

proc sql;
  create table as
    select a.level China USA
    from resdat.china as a
    inner join
    resdat.usa as b
    on a.level=b.level
;
  select * from pingpang;
quit;

#output
level    china   usa
1        c02     u00
2        c03     u02
2        c03     u01
3        c04     u03

在SQL中应具体匹配到关键字,然后会从笛卡儿积中选取两个表中同时都存在的观测作为内连接。

笛卡儿积意为两个表循环进行匹配,一个5条记录的表与一个4条记录的表能够产生的笛卡儿积为5*4=20,以下为sas中求笛卡尔积的代码段:

proc sql outobs=3;                                                                                                                               
select inner1.*,inner2.*                                                                                                                
from inner1,inner2                                                                                                                      
;                                                                                                                                       
quit; 

outobs表示输出的观测数,对应inobs,类似于firstobs和obs的作用。



SELECT语句

当使用as为变量分配别名时,别名只在当前的查询中有效。


CASE语句:使用CASE语句时可以设定带有逻辑条件的语句,例如:

proc sql;
select * 
  case
    when x = '1' then 'sh'
    when x = '2' then 'xz'
    else 'others'
    end as x
from table_name
order by column_name;
quit;
CASE表达式的最后必须使用END关键字。


在输出时,可以制定输出的COLUMN的格式,比如format、informat、label、lenth。如select  column_name label = 'today price' column2_name format = comma 10.2


可以通过某列的位置指定其作为排序键,比如select  name1  name2  name3  from  table_name  order by 3 desc; 由此语句可以得到以第3列name为关键字进行排序的结果。


WHERE 语句:

contains:  where  column_name  contains  'my_name';  当指定列中包含某些字符时返回该列,常用于查询包含某些特殊字符串的观测。

like: where column_name  like  'A%';  检查指定列是否满足某种格式,例子意为检查该列是否以A开头,常用于检查某一列变量是否为某种模式。

sum: select  sum(column_name)  as  total  from  table_name;  使用sum函数对某一列求和。

count : select  count(distinct  column_name)  as  count  from  table_name;  使用count函数对某一列进行不重复计数。


HAVING语句:受GROUP BY语句的影响,对分组进行筛选,当查询中没有GROUP BY语句时,与WHERE语句作用相同,例:

proc sql;
select column_name  count(*)  as column2
from  table_name
group  by  column_name
having  substr(columen_name,1,1) in ('0','6');
quit;
上例即为查询column_name中以0或6开头的观测,并输出这些观测组的计数。

通过proc sql对数据集插入一条数据:

proc sql;                                                                                                                               
                                                                                                                                        
insert into inner1(pk,label)                                                                                                            
values(5,'y')                                                                                                                           
;                                                                                                                                       
quit;







版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/coder_wcr/article/details/78743585
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-13 20:18:43
  • 阅读 ( 2296 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢