๐Ÿ•น๏ธ

5.3.3. SAS์˜ SQL

๋ชฉ์ฐจ

1. sql์ด๋ž€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
ย 

2. sql ๊ธฐ๋ณธ๊ตฌ์กฐ

sql ๊ธฐ๋ณธ ๊ตฌ์กฐ
proc sql; /*SQL ๋ฌธ์žฅ*/ quit;
sql ๊ธฐ๋ณธ ๊ตฌ์กฐ
PROC SQL; CREATE TABLE AS SELECT FROM WHERE GROUP BY HAVING ORDER BY
ย 
๐Ÿ’ก
์ฃผ์˜์‚ฌํ•ญ : WHERE ๊ณผ GROUP BY ์˜ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 

3. ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

PROC SQL; CREATE TABLE ๋ฐ์ดํ„ฐ์…‹ (๋ณ€์ˆ˜๋ช… CHAR(12) ,๋ณ€์ˆ˜๋ช… NUM ) ; QUIT;
ย 
PROC SQL; CREATE TABLE mysas.table2 (NAME CHAR(12) ,AGE NUM ,HEIGHT NUM ,WEIGHT NUM ,ADDR CHAR) ; QUIT;
ย 
notion imagenotion image
ย 

4. ๊ธฐ์กด ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

PROC SQL; CREATE TABLE ํ…Œ์ด๋ธ” AS SELECT ๋ณ€์ˆ˜, ๋ณ€์ˆ˜, ๋ณ€์ˆ˜ FROM ๊ธฐ์กด ํ…Œ์ดํ„ฐ์…‹ ; QUIT;
ย 
PROC SQL; CREATE TABLE mysas.table1 AS SELECT id, name, class_ FROM mysas.subject_test1_1 ; QUIT;
ย 
notion imagenotion image
ย 

5. ๋ฐ์ดํ„ฐ ์ž…๋ ฅํ•˜๊ธฐ

TABLE2๋ฅผ ๊ฐ€์ ธ์™€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
1) ๋งค ํ–‰๋งˆ๋‹ค ์ž…๋ ฅํ•  ์นผ๋Ÿผ๋ช…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
PROC SQL; INSERT INTO ๋ฐ์ดํ„ฐ์…‹ SET ๋ณ€์ˆ˜๋ช…=๊ฐ’, ๋ณ€์ˆ˜๋ช…=๊ฐ’ ; QUIT;
ย 
proc sql; insert into mysas.table2 set NAME='ํ™๊ธธ๋™', AGE=20, HEIGHT=180, WEIGHT=70, ADDR='JEJU' ; quit; proc print data=mysas.table2; run;
ย 
notion imagenotion image
ย 
๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ์นผ๋Ÿผ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์นผ๋Ÿผ์ˆ˜๋งŒํผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
2) ๋ˆ„๋ฝ๊ฐ’์ด ์žˆ๋”๋ผ๋„ VALUE๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
INSERT INTO TEST (XXX,YYY,ZZZ) VALUE(โ€˜AAAโ€™,โ€˜BBBโ€™,111);
ย 
proc sql; insert into mysas.table2(NAME, AGE, ADDR) values('๊น€๊ธธ์ˆœ', 55 ,'SEOUL') ; run; proc print data=mysas.table2; run;
ย 
notion imagenotion image
ย 
์‚ฌ์น™์—ฐ์‚ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
PROC SQL; CREATE TABLE ํ…Œ์ด๋ธ” AS SELECT ๋ณ€์ˆ˜, ๋ณ€์ˆ˜+๋ณ€์ˆ˜ FROM ๊ธฐ์กด ํ…Œ์ดํ„ฐ์…‹ ; QUIT;
ย 
proc sql; create table mysas.table3 as select NAME, HEIGHT / WEIGHT from mysas.table2 ; quit; PROC PRINT DATA=mysas.table3; run;
ย 
notion imagenotion image
ย 
+(๋”ํ•˜๊ธฐ), -(๋บ„์…ˆ), *(๊ณฑํ•˜๊ธฐ), /(๋‚˜๋ˆ„๊ธฐ) ์‚ฌ์น™์—ฐ์‚ฐ์„ ์ด์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

6. ํ‰๊ท , ๋ถ„์‚ฐ, ๊ฐ„๋‹จํ•œ ์ˆซ์ž ์„ธ๊ธฐ

SELECT SUM(๋ณ€์ˆ˜), SUM(๋ณ€์ˆ˜1,๋ณ€์ˆ˜2), MEAN(๋ณ€์ˆ˜), MIDIAN(๋ณ€์ˆ˜), MIN(๋ณ€์ˆ˜), MAX(๋ณ€์ˆ˜), VAR(๋ณ€์ˆ˜), STD(๋ณ€์ˆ˜), COUNT(๋ณ€์ˆ˜), COUNT(๋ณ€์ˆ˜1,๋ณ€์ˆ˜2)
  • SUM(XXX,YYY) : ์นผ๋ŸผXXX์™€ YYY์˜ ๊ฐ’์„ ๋ชจ๋‘ ๋”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • MEAN(XXX) : ์นผ๋ŸผXXX์˜ ํ‰๊ท ๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • MIDIAN(XXX) : ์นผ๋ŸผXXX์˜ ์ค‘์•™๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • MIN(XXX) : ์นผ๋ŸผXXX์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • MAX(XXX) : ์นผ๋ŸผXXX์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • VAR(XXX) : ์นผ๋ŸผXXX์˜ ๋ถ„์‚ฐ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • STD(XXX) : ์นผ๋ŸผXXX์˜ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
ย 
proc sql; create table mysas.table3 as select NAME, sum(HEIGHT,WEIGHT) from mysas.table2 ; quit; PROC PRINT DATA=mysas.table3; run;
ย 
notion imagenotion image
ย 
๋‹ค์Œ์œผ๋กœ SUM(HEIGHT,WEIGHT)์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์นผ๋Ÿผ TEMA001์ด ์ƒ์„ฑ๋์Šต๋‹ˆ๋‹ค. ๊ฐ ํ–‰์—์„œ ์นผ๋ŸผHEIGHT์™€ ์นผ๋ŸผWEIGHT๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ๊ฐ์˜ ํ–‰์ด ๊ฐ’์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํŠน์ด์ ์ด ์šฐ๋ฆฌ๋Š” ๋ถ„๋ช… SELECT๋ช…๋ น์–ด์—์„œ ๋ณ€์ˆ˜HEIGHT์™€ WEIGHT๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ SQL๋ช…๋ น์–ด์˜ ํŠน์ง•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ SELECT๋กœ ์นผ๋ŸผWEIGHT์„ ํ‘œํ˜„ํ•˜์ง€ ์•Š๋”๋ผ๋„, FROM ํ…Œ์ด๋ธ”์— ์นผ๋ŸผWEIGHT๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, SQL์€ ์ด๋ฅผ ์ธ์‹ํ•˜๊ณ  ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
SELECT๋ช…๋ น์–ด๋Š” ์นผ๋Ÿผ์„ ํ‘œํ˜„ํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ๋งŒ์„ ํ•˜๋Š” ์…ˆ์ž…๋‹ˆ๋‹ค.
ย 

7. ์ƒˆ ์นผ๋Ÿผ ์ด๋ฆ„ ๋ถ€์—ฌ

PROC SQL; CREATE TABLE TEST AS SELECT ๋ณ€์ˆ˜๋ช…, ๊ธฐ์กด๋ณ€์ˆ˜๋ช… AS ์ƒˆ๋กœ์šด๋ณ€์ˆ˜๋ช… FROM SASHELP.CLASS ; QUIT;
ย 
PROC SQL; CREATE TABLE mysas.table4 AS SELECT NAME, _TEMA001 AS HW FROM mysas.table3 ; QUIT;
ย 
notion imagenotion image
ย 
ย 
ํŠน์ • ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
PROC SQL; CREATE TABLE mysas.table5 AS SELECT NAME, AGE, ADDR FROM mysas.table2 WHERE AGE=20 ; QUIT;
ย 
notion imagenotion image
ย 

8. AND์™€ OR

PROC SQL; CREATE TABLE mysas.table6 AS SELECT NAME, AGE, HEIGHT FROM mysas.table2 WHERE AGE=20 AND ADDR='JEJU' ; QUIT;
ย 
notion imagenotion image
ย 

9. ๋ฐ์ดํ„ฐ ์ •๋ ฌ

PROC SQL; CREATE TABLE mysas.table7 AS SELECT * FROM mysas.subject_test1 ORDER BY score ; QUIT;
ย 
notion imagenotion image
ย 
์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ORDER BY ๊ตฌ๋ฌธ์„ ํ†ตํ•ด์„œ ์ •๋ ฌ์„ ํ•  ๋•Œ ์นผ๋ŸผAGE๋งŒ ๋ฐ”๋€Œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ์นผ๋Ÿผ์ด ๋ชจ๋‘ ํ•จ๊ป˜ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
ย 
๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ํ•˜๋ ค๋ฉด โ€˜ORDER BY AGE DESC'๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.`
PROC SQL; CREATE TABLE mysas.table7 AS SELECT * FROM mysas.subject_test1 ORDER BY score desc ; QUIT;
ย 
notion imagenotion image
ย 
์—ฌ๋Ÿฌ ๊ฐœ ์นผ๋Ÿผ์„ ๋™์‹œ์— ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ' , '๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•ด์ค๋‹ˆ๋‹ค.
ORDER BY name, score: name๋ฅผ ์ •๋ ฌํ•˜๊ณ , name๋ณ„๋กœ score์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
ย 

10. ๊ทธ๋ฃน๋ณ„๋กœ ์—ฐ์‚ฐ

ํด๋ž˜์Šค๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์— ๋ฐ˜๋ณ„๋กœ score ์ ์ˆ˜๋ฅผ ๋‚ด๊ณ  ๋ณ€์ˆ˜๋ช…์€ sum_score์œผ๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
PROC SQL; CREATE TABLE mysas.table9 AS SELECT *, SUM(score) AS sum_score FROM mysas.subject_test1 GROUP BY class_ ; QUIT;
ย 
notion imagenotion image
ย 
๊ทธ๋ฃน๋ณ„ ํŠน์ • ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
PROC SQL; CREATE TABLE mysas.table10 AS SELECT *, SUM(score) AS sum_score FROM mysas.subject_test1 GROUP BY class_ HAVING sum_score>=175 ; QUIT;
GROUP BY : ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
ย 
notion imagenotion image
ย 
๋งŒ์•ฝ GROUP BY๋ช…๋ น์–ด ๋‹ค์Œ์— WHERE๋ช…๋ น์–ด๋ฅผ ์“ธ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๊ณ  GROUP BY๋ช…๋ น์–ด ์•ž์ชฝ์— WHERE๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ย 
WHERE sum_score >= 175 GROUP BY class_
ย 
GROUP BY๋ช…๋ น์–ด ๋‹ค์Œ์—๋Š” ๋ฐ˜๋“œ์‹œ HAVING๋ช…๋ น์–ด๊ฐ€ ๋‚˜์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” SAS SQL์˜ ๋ฌธ๋ฒ•๊ทœ์น™์ž…๋‹ˆ๋‹ค.
ย 
์™œ๋ƒํ•˜๋ฉด sum_score๋Š” ๊ธฐ์กด ํ…Œ์ด๋ธ”์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
sum_score๋Š” SQL๋ช…๋ น์–ด์— ์˜ํ•ด์„œ ์ƒ์„ฑ๋์Šต๋‹ˆ๋‹ค.
WHERE ๋ช…๋ น์–ด๋Š” SQL๋ช…๋ น์–ด์— ์˜ํ•ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์นผ๋Ÿผ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ค์ง FROM์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ ํ…Œ์ด๋ธ”์— sum_score๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
ํ…Œ์ด๋ธ”์— sum_score๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์ด๋ฅผ ์—๋Ÿฌ์—†์ด ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Group By ์ ˆ ๋‹ค์Œ Having ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
GROUP BY class_ HAVING sum_score >=175
ย 
HAVING๋ช…๋ น์–ด๋Š” SQL๋ช…๋ น์–ด์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ๊ณ„์‚ฐ๋œ ํ›„์˜ ๋ชจ๋“  ์นผ๋Ÿผ์„ ๋Œ€์ƒ์œผ๋กœ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ย 
์ด๋ ‡๊ฒŒ ํ•ด์„œ sas๋ฅผ ์ด์šฉํ•œ sql๋ฌธ์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ sql๋ฌธ๋„ sql ๊ธฐ๋ณธ๊ตฌ์กฐ ์•ˆ์— ๋„ฃ์œผ๋ฉด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.