proc sql; /* 查看表中变量的非重复观测值 */
select distinct name as uniue_name
from class;
quit;
proc sql; /* 查看表中总观测数, 变量的非重复值总数 */
select count(*) as N, count(distinct name) as n_name
from class;
quit;
proc sql; /* 查看表中部分内容, 并计算新变量 */
select name, sex, weight/(height*0.01)/(height*0.01) as BMI, weight
from class;
quit;
proc sql; /* 用 count(), Max() 函数 和 group by */
select sex,
count(sex) as count, /* 查看表中男(M),女(F)各有多少条纪录 */
max(weight) as Max_weight /* 和最大重量 */
from class
group by sex; /* 用 group by 语句分组 */
quit;
proc sql; /* 选出满足条件的内容, */
select name, sex, weight, height
from class
where weight > 100 /* 在 from 语句后, group by前,使用 where 条件语句 */
group by sex /* 用 group by 语句分组 */
having height < 70 /* 在 group by 后,用 having 条件语句 */
order by name; /* 最后用 order语句 排续*/
quit;
/* working with two or more tables */
/* sample datasets */
data class_a; /* having 4 observations */
input name $ course1;
datalines;
A 100
B 100
C 100
F 100
;
data class_b; /* having 4 observations */
input name $ course2;
datalines;
A 80
C 80
D 80
G 80
;
data class_c; /* having 3 observations */
input name $ course3;
datalines;
A 60
F 60
G 60
;
proc sql; /* cartesian join: 生成多个表中所有行的全部组合 */
select * /* 4x4x3=48 行 */
from class_a as a, class_b as b, class_c; /* use , seperate tables */
quit;
/* inner join: 从cartesian join生成的表中找出满足指定条件的行 */
proc sql; /* inner join two tables */
select a.name, a.course1, b.course2
from class_a as a, class_b as b /* use , seperate tables */
where a.name=b.name; /* use where condition */
quit;
proc sql; /* inner join three or more tables */
select a.name, a.course1, b.course2, c.course3
from class_a as a, class_b as b, class_c as c
where a.name=b.name=c.name; /* use where condition */
quit;
/* outer join, 只限于两个表的合并, 共有三种outer join */
proc sql; /* 第一种: left join */
select a.*, b.* /* 选出左表的全部及右表中满足条件的行. 左表中不满足条件的行设为missing */
from class_a as a /* left table */
left join /* use LEFT JOIN keyword */
class_b as b /* right table */
on a.name = b.name; /* use ON condition */
quit;
from class_a as a /* left table */
right join /* use RIGHT JOIN keyword */
class_b as b /* right table */
on a.name = b.name; /* use ON condition */
quit;
proc sql; /* 第三种: full join */
select a.*, b.* /* 选出左右表中满足条件和不满足条件的行, 不满足条件的行设为missing */
from class_a as a /* left table */
full join /* use FULL JOIN keyword */
class_b as b /* right table */
on a.name = b.name; /* use ON condition */
quit;
proc sql noprint; /* create a macro variable */
select count(*) into : nobs
from class;
quit;