SAS 中SELECT的两种不同的用法
data 步中的select语句(1)
SELECT(选择表达式);
WHEN(值列表) 语句;
WHEN(值列表) 语句;
...
OTHERWISE 语句;
END;
*
功能及流程:
执行SELECT结构时,先计算出选择表达式和值列表中的所有值,然后把选择表达式值由前
向后与值列表中的值相比,发现相等值则执行对应的语句,然后退出SELECT结构(不再查
看后面的值列表)。如果选择表达式的值不等于任何值列表中的值则执行OTHERWISE对应
的语句,这种情况下没有OTHERWISE语句会出错。
;
类似于Java和C#之类语言中的switch语句
DATA gebanma;
INPUT month $10.;
datalines;
Mar
Jun
oct
aug
xxx
Jul
Apr
guixiaode
dec
Feb
;
run;
data popSea;
set gebanma;
length season $10.;
SELECT(month);
WHEN('Feb', 'Mar', 'Apr') season= '春天';
WHEN('May', 'Jun', 'Jul') season= '夏天';
WHEN('aug', 'sep', 'oct') season= '秋天';
WHEN('dec', 'nov', 'jan') season= '冬天';
OTHERWISE season= '在武汉';
END;
run;
data 步中的select语句(2)
SELECT;
WHEN(值列表) 语句;
WHEN(值列表) 语句;
...
OTHERWISE 语句;
END;
*
这种SELECT语句没有选择表达式,而是在每一个WHEN语句指定一个条件(逻辑表达式),
执行第一个满足条件的WHEN后的语句。如果所有条件都不满足则执行OTHERWISE后的语句。
例:
;
data;
input age @@;
put age @;
SELECT;
WHEN(age<=12) put '少年';
WHEN(age<35) put '青年';
OTHERWISE put '中老年';
END;
cards;
10 30 50
;
run;
PROC SQL中的 SELECT CASE WHEN 语句
proc sql outobs=12;
title 'haha';
select Name,Continent,
case Continent
when 'North America' then 'Continental U.S.'
when 'Oceania' then 'Pacific Islands'
else 'None'
end as Region
from sql.unitedstates;
quit;
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
CASE WHEN sex= '1' THEN '男'
WHEN sex= '2' THEN '女'
ELSE '其他' END
ps: case函数仅返回第一个符合条件的值,剩余的部分自动被忽略
CASE WHEN col_1 IN ('a','b')THEN '第一类'
WHEN col_1 IN ('a')THEN '第二类'
case的用途
SELECT SUM(population),
CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
ELSE '其他' END
FROM Table_A
GROUP BY CASE country
CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
ELSE '其他' END;
SELECT
CASE WHEN salary <=500 THEN '1'
WHEN salart >500 AND salary <=600 THEN '2'
WHEN salart >600 AND salary <=800 THEN '3'
WHEN salart >800 AND salary <=1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <=500 THEN '1'
WHEN salart >500 AND salary <=600 THEN '2'
WHEN salart >600 AND salary <=800 THEN '3'
WHEN salart >800 AND salary <=1000 THEN '4'
ELSE NULL END;
SELECT country,
sum(CASE WHEN sex='1' THEN population ELSE 0 END),
SUM(CASE WHEN sex='2' THEN population ELSE 0 END)
FROM Table_A
GROUP BY country;
UPDATE Some table
SET p_key = CASE WHEN p_key = 'a'
THEN 'b'
WHEN p_key = 'b'
THEN 'a'
ELSE p_key END
WHERE p_key IN ('a', 'b');
CASE函数不同于DECODE函数。在CASE函数中,可以使用BETWEEN,LIKE,IS,NULL,IN,EXISTS等等,比如说使用IN,EXISTS,可以进行子查询,从而实现更多功能。
SELECT keyCol,
CASE WHEN keyCol IN(SELECT keyCol FROM tbl_B)
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
SELECT keyCol,
CASE WHEN EXISTS (SELECT *FROM tbl_B
WHERE tbl_A.keyCol=tbl_B.keyCol)
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
在CASE中使用聚合函数
SELECT std_id,MAX(class_id)AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*)=1;
SELECT std_id,class_id as main_class
FROM Studentclass
WHERE main_class_flag='Y';
看使用case函数,能够如何进行简化
SELECT std_id,
CASE WHEN COUTN(*) =1
THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flag='Y'
THEN class_id
ELSE NULL END)
END AS main_class
FROM Studentclass
GROUP BY std_id;
CASE col_1
WHEN 1 THEN 'Right'
WHEN NULL THEN 'Wrong'
END