Chapter 2. Performing Advanced Queries Using PROC SQL


SELECT statement의 일반적인 형식은 다음과 같습니다.

SELECT 명령어를 통해 결과물에 들어갈 열(column)을 지정해주고요. 

FROM을 통해 어떤 데이터 테이블을 사용할지, 

WHERE을 통해서 조건문을 설정하고요

GROUP BY을 통해 특정 열을 그룹지을 수 있습니다. 

HAVING은 나중에 다루도록 합니다. 



1. Displaying ALL Columns 

SELECT문구를 통해 결과물에서 보여줄 column만 적어준다고 했는데요. 데이터테이블에 있는 모든 열을 보고 싶은 경우 * (asterisk, 별표)를 넣으면 됩니다. default값으로 모든 행의 값이 출력하게 됩니다


PROC SQL; 

select * 

from sasuser.staffchanges; 


위에 내용은 sasuser라이브러리에 있는 staffchagnes라는 테이블의 모든 열을 보여달라는 명령어겠죠. 

참고로 이렇게 SELECT * 를 사용할 경우, 옵션으로 FEEDBACK을 사용할 수 있습니다. 


PROC SQL FEEDBACK

select * 

from sasuser.staffchanges; 


그러면 SAS 로그파일에서 다음과 같은 내용이 뜨게 됩니다. 디버깅할때 용이하겠죠. 



2. Limiting the Number of Rows Displayed 

만약 특정 숫자의 행만 보고싶을 경우 어떻게 하면 될까요. 이때, outobs를 설정하면 됩니다. 


PROC SCQ OUTOBS = n; 


아래 명령어를 보면, 10개의 행을 출력하는데,  sasuer라이브러리에 있는 flightschedule테이블에 flightnumber와 date변수만 나오게 하라라고 되어있습니다. 하지만 이렇게 행의 개수를 제한하는 옵션을 사용할 경우, SAS 로그 파일에서 warning 메시지가 뜨게 됩니다. (Statement terminated early due to OUTOBS=10 option.) 


3. Eliminating Duplicate Row from Output 

테이블에서 어떤 행들이 중복되어 값이 들어가있을때, 중복된건 빼고 싶을 경우 SELECT구문안에 DISTINCT를 사용하면 됩니다. 이때 DISTICT는 모든 열에 해당하거나 아니면 특정 열에 해당할 수 있어요. 


아래 예제를 보면 sasuser라이브러리에 있는 internationalflights데이타를 불러와서 flightnumber와 destination의 열에서 12개의 행을 가져오라고 했는데요. 보면 182 YYZ가 두번 겹쳐 있네요? 이렇게 Flightnumber가 중복되어있는게 여러개 보입니다.  Flightnumber에서 중복된 값을 제거하도록 합시다. 



아래 명령어에서 주목해야할 outbos= 옵션이 없어졌다는것과,  SELECT DISTINCT flightnumber, destination 즉 select 구문에서 disticnt가 들어가있다는것!! 이때 sort를 order by 1 즉, 첫번째 열인 Flightnumber를 default값인 오름차순으로 정렬되어있습니다. 







# SAS 자격증, SAS Advanced programming, SAS Prep Guide 

반응형

Chapter 1. Performing Queries using PROC SQL 퀴즈 및 문제풀이



1. Which of the clauses in the PROC SQL program below is written incorrectly?

proc sql;
    select style sqfeet bedrooms

from choice.houses

where sqfeet ge 800;

    a. SELECT

    b. FROM

    c. WHERE

    d. both a and c



    어디가 잘못되었는지 찾는 문제인데요. 

    답은 a. SELECT입니다. SELECT에서 만들고자하는 테이블의 열을 지정해줘야하는데, 이때 스페이스로 (blank) 구분되는게 아니라 comma(,)로 열을 구분합니다. 




    2. How many statements does the program below contain?

    proc sql;

    select grapes,oranges,

       grapes + oranges as sumsales 

    from sales.produce

    order by sumsales;

    a. two 

    b. three 

    c. four 

    d. five



    몇개의 statements가 있는지 찾는 문제입니다. 두개의 statements가 있고요. 하나는 PROC SQL, 다른 하나는 SELECT 입니다. SELECT 명령어에는 3개의 절이 있네요.  




    3. Complete the following PROC SQL query to select the columns Address and SqFeet from the table List.Size and to select Price from the table List.Price. (Only the Address column appears in both tables.)


    proc sql; 

    _____________

    where size.address = price.address; 

    from list.size,list.price;


      a. select address,sqfeet,price

      b. select size.address,sqfeet,price

      c. select price.address,sqfeet,price

      d. either b or c



      PROC SQL의 query를 완성하라는 질문인데요. Address와 SqFeet의 열을 Size라는 테이블에서 불러오고, Price를 Price라는 테이블에서 불러오려고 합니다. 이때 Address의 열은 두개의 테이블에 있다고 합니다. 먼저 두개의 테이블에 같이 있는 공동 변수를 먼저 지정해줘야하겠죠. Select 를 사용해서 address를 먼저 설정해줘야하니 a는 아니고요. adress변수를 size테이블에서 불러와야하니까 size.(period)address 라고 적어줘야해서 답은 b 입니다. 



    4. Which of the clauses below correctly sorts rows by the values of the columns Price and SqFeet?

    a. order price, sqfeet 

    b. order by price,sqfeet 

    c. sort by price sqfeet 

    d. sort price sqfeet



    sort 정렬 방법에 대한 질문입니다. Price와 SqFeeet의 변수를 기준으로 졍렬을 하려고 하는데요. SORT BY 구문을 사용하면 됩니다. 한개 이상의 변수를 , 콤마 넣으면 되어서 답은 b!! 




    5. Which clause below specifies that the two tables Produce and Hardware be queried? Both tables are located in a library to which the libref Sales has been assigned.

    a. select sales.produce sales.hardware 

    b. from sales.produce sales.hardware 

    c. from sales.produce,sales.hardware 

    d. where sales.produce, sales.hardware



    두개의 Produce와 Hardware 테이블을 불러오려고 하는데요. 이때 얘네들이 Sales라는 라이브러리에 있다고 합니다. 불러오려고 할때 FROM을 이용하죠. 라이브러리이름.테이블이름, 라이브러리이름.테이블이름 이렇게 쓰면 됩니다. 그래서 답은 c. 




    6. Complete the SELECT clause below to create a new column named Profit by subtracting the values of the column Cost from those of the column Price.


    select fruit,cost,price, 

    ________________ 

a. Profit=price-cost
b. price-cost as Profit 

c. profit=price-cost
d. Profit as price-cost 



명령어를 완성하는건데요. 새로운 열, Profit을 만들려고하는데 이때 값을 Cost열의 값과 Price라는 값의 차이를 넣어주려고 합니다. Select 구문 아래에 만들어줘야하고요. 이때 새로운 변수를 생성하려면 as 를 사용해서 (필수는 아니고요) Profit 이라고 새 변수이름을 적어주면 됩니다.  그래서 답은 b!! 




#SAS 자격증, SAS advanced, SAS Advanced Programming, SAS Prep Guide, SAS 문제풀이

반응형

Chapter 1. Performing Queries using PROC SQL - (2)

Querying Multiple Tables 

이번에는 여러개의 테이블에서 데이타를 추출하는 내용을 정리해봅니다. 

만약 데이타가 아래 그림처럼 이뤄져있다고 합시다. 

 Table A

 Table B 


Proc SQL을 통해 데이타를 rows (행)을 기준으로 합칠 수 있는데요. 이걸 joining table 이라고 합니다. 



INNER JOIN 방법 



오른쪽처럼 테이블을 만들려고 하는데요. Employee ID넘버로, 하나의 열엔 LastName, Salary, NewSalary 이런 데이타가 이뤄지도록 만들고 싶습니다. 그러니까 총 4개의 column이 되겠네요. Salcomp이라는 테이블엔 EmpID에서 LastName을 가져와야하고, Newsale테이블에 EmpID 변수가 있는데 여기의 salary와 NewSalary를 데려오면 되겠네요. 이때 EmpID가 서로 매치되어있어야겠고요. 


PROC SQL 방법으로 만들 수 있습니다. 코드는 아래와 같아요. 




1. Specifying Columns That Appear in Multiple Tables

먼저 만들고자하는 테이블을 구성하는 열이 뭔지 생각해야겠죠. 그래서 그 열이 어느 테이블에 있는지 불러와야할테고요. 

다음처럼 SELECT 구문을 사용하면 됩니다. 


SELECT 테이블이름.열이름,열이름, 


sasuser라는 라이브러리에 Salcomps와 Newsals라는 데이터가 있고요. 두개의 데이타에 똑같이 EmpID라는 변수가 있습니다. Proc SQL을 통해 EmpID를 어디에 읽을지, 그리고 SELECT 구문을 통해 어떤 열을 불러올지 정하는건데요. 


proc sql;

select salcomp.empid,lastname, 

    newsals.salary,newsalary 


이렇게 데이타이름 뒤에 . (period) 찍고 기준이 되는 열이름 (empID)을 적습니다. 이렇게 지정해주면 newsals데이타에 점(period)찍고 salary라고 적은것도 기준이되느게 아니냐라고 하는데, 그건 아니고요. 이건 syntax때문에 이렇게 적은겁니다. 



2. Specifying Multiple Table Names

from sasuser.salcomps, sasuser.newsals 

라는 문구를 보면, 이렇게 어느 라이브러리에 있는 어떤 데이타를 불러올건지, FROM명령어를 통해 지정해줍니다. 

FROM 라이브러리이름.(period)데이터이름 ,(comma) 라이브러리이름.데이터이름 


3. Specifying A Join Condition

where salaams.empid=newsals.empid 

여러개의 테이블을 합칠때 꼭!!! WHERE구문을 통해 어떤 변수을 기준으로 매치(match)되어야하는지 지정해줘야하는데요. 만약 지정한 변수에서 그 안의 값들이 서로 일치하지 않을때, 그러니까 EmpID가 두 데이타 각각 다른 숫자들로 이뤄져있을때 결과값으로 0개의 행이 나오게 됩니다. 그리고 지정한 변수의 type도 꼭 같아야 합니다. 알아서 type을 바꿔서 불러오지 않아요. 


이렇게 하면 아래 그림처럼 아웃풋이 나오게 됩니다. 보니까 EmpID 숫자들이나 LastName이 정렬이 되어있지 않네요? 그냥 두개의 데이타가 합친거뿐이라서 그럽니다. 


4. Ordering Rows 

이제 행을 정렬해봅시다. 성 순으로 정렬을 해볼꺼예요. 이때 order by lastname; 이라고 하면 됩니다. 






#SAS 자격증, SAS advanced, SAS Advanced Programming, SAS Prep Guide 

반응형

어제 마지막으로 TA, 조교일을 마쳤습니다. 전 캐나다에서 석사생이고요. 펀딩받으면서 따로 조교일을 하고 있습니다. 

펀딩이라고 해봤자, 학비 + 책값, 교통비 충당하는 정도이고요. 그 외 생활비는 조교일정도면 충분했습니다. 반면 썸머때는 박사생 우선으로 조교일이 주워지고요. 박사생 중 한명이 방학때 자리를 비우게 되면서 그 일을 제가 맡게 되었습니다. 


우선, 강조할껀 학교마다, 부서마다 분위기가 굉장히 달라서 제가 팁이라고 적은게 어느곳에서나 다 해당되지 않는다는점. 강조하며 1년간 조교일하면서 느꼈던 팁 적어봅니다. 


1. 교수님 성향 & 분위기 파악 

학기가 시작하기 전, 8월에는 가을학기 조교일이 주워지게 되는데요. 어떤 과목인지 어떤 교수님 아래에서 일하는지 알게 됩니다. 저희 학교같은 경우, 조교들이 교수님 말씀으로는 꾸뻑 넘어가고 이런건 없었어요. 그냥 코워커처럼, 교수님께서 일에 관해 이메일 보내면 조교생들은 거기에 맞춰서 시간조율하고 


2. 시간관리 중요성. 

공부하면서 조교일하는건 쉽지 않습니다. 특히 전 4과목 들으면서 조교일할때 정말 정신 없었어요. 제가 150명 학생의 과제를 1주일에 한번씩 그렇게 두번 연달아 채점했었는데요. 한번 채점하는데 거의 10시간 가까이 일을 했는데, 저 역시 과제가 있고 시험기간이라 10시간이면 어마어마한 시간이죠. 이럴땐 교수님과 시간조율을 해야하는데요. 전 그러지 못했습니다. 그런데 그럴 필요가 전혀 없었어요. 석사생들은 공부하러 온겁니다. 조교일은 두번째죠. 저한테 일이 주워지면 빨리빨리 해주는 성격인데, 우선순위를 정하는게 제일 중요해요. 그래서 시간관리 정말 중요합니다. 공부와 일이 겹치면, 무조건 조교 담당 교수님에게 이러이러한 일이 있어서 시간조율이 필요하다라고 전해보세요. 거의 백이면 백 이해해주십니다. 두려워하지 마시고, 어려워하지 마시고 예의를 갖춰서 말씀드리는거 정말 추천입니다. 


3. 시험감독 팁. 

시험감독 처음할때 너무 신났어요. 아..나도 시험감독이라는걸 하는구나. 하지만 웬걸요. 정말 너무너무너무너무너무너무너무너무 지루합니다. 특히 기말고사 3시간은 너무 지루해서 온 몸이 꼬여버릴것만 같아요. 대형시험이면 돌아다니면서 운동이라도 하죠. 10명 남짓한 학생들이 3시간동안 시험보는 시험감독하면 하아...너무너무 심심해요. 일에 관한건 어렵지 않습니다. 


  1. 만약 인원수가 적은 시험감독을 할 경우, 필요한 일을 다 마친 뒤 (예를들어 학생들 사인 받는거) 페이퍼같은걸 읽을 수 있는지 교수님에게 양해구하기. 
  2. 인원수가 많은 시험감독일땐 여기저기 돌아다니다가 뒷자리에 서있는게 제일 킹왕짱입니다. 맨 앞에 있는것보다 뒤에 서있거나 뒤에 앉아있는게 학생들 감독하게 제일 편해요. 
  3. 문제에 관한 질문이 들어오면 전 교수님에게 물어보라고 합니다. 뭐 간단한거는 대답해주지만 간혹 어떻게 푸냐고 물어보는 대담한 학생도 있어요. 후덜덜덜 
  4. 시험보는 동안, 학생들 몇명이 시험보는지 세어볼것. 
  5. 시험지 걷을땐 이름과 학번, 시험지에 사인되어있는지 확인할것 
  6. 시험지 다 걷고 시험지가 몇개인지, 그 전에 세어본것과 일치한지 확인할것. 

이정도예요 :) 


4. 채점 팁. 

시험 채점할때 팁. 이건 대학생분들도 알면 좋은 꿀팁이 될것 같아요. 우선 교수님에게 시험지(과제) 받을때 솔루션 매뉴얼도 같이 받을텐데요. 마킹스킴이 있는지 확인해보세요. 그러니까 점수를 몇점 줄것인지.. 등등이요. 


문과생들의 에세이같은 경우 저도 잘 모르겠고요. 

이과생들의 문제푸는 경우, 과정이 정말 중요합니다. 문제푸는 과정과 정답을 정확하게 적으셔야해요. 


마킹스킴 (marking scheme)이 정확히 정해져있는경우, 정말 거기에 맞게 채점 꼼꼼히 잘 해야합니다. 

하지만 정해져있지 않은 이걸 꼭 기억합시다.


Consistency!! 바로 일관성인데요. 교수님에게 채점 다 했다 하면서 consistency하게 했다라고 꼭 적어요. 채점에서 제일 중요한건 공정하게 채점하는거라고 생각합니다. 점수를 후하게 주던, 짜게 주던 결국 누구에게나 공정한 채점이여야하는거죠. 재채점해달라고 요구가 들어올때도 있는데, 난 공정하게 했다라고 하면 할말이 없어요. 뭐 점수 합산 에러가 아닌 이상요. 


채점을 다 한 후, 교수님에게 이메일 보낼때 전 간략하게 정리해서 보내드립니다. 총 채점한 시험지 수, 평균점수, 어떤 문제를 많이 틀렸는가, 솔루션 매뉴얼에 오타가 없는가, 등등 이런 내용이요. 그러면 백이면 백!! 진짜 교수님 너무너무너무 좋아하십니다. 좋아하시라고 이렇게 이메일을 보내는건 아니고요. 전 채점의 일 중에 이것도 포함이라 생각하고 정리해드렸는데 반응이 좋네요. 





제 포스팅이 도움되었으면 합니다 :) 

가을학기 공부도 조교일도 즐겁게 하시길 바라요~ 


반응형

SAS Certified Base Programmer for SAS 9 합격후기 

이 많은 자격증 중에 이제 첫걸음을 했네요. 올해는 자격증 두개가 목표고요. 취업하더라도 꾸준히 자격증 공부하려고 합니다.



전 캐나다에서 시험봤고요(2017년 6월). 국제자격증이긴 하지만 한국과 다른점이 있는지는 잘 모르겠습니다. 그래도 아직 머리에 시험에 대한 기억이 남아있을때 후기 적어보려고 합니다. 



1. 공부 기간? 

준비기간 열흘정도이지만 한 ~ 두시간정도만 했고요. 집중해서 공부한건 하루에 3~4시간 정도? 3일 이었습니다. 통계 데이타 다룰때 SAS로 돌려본적은 있지만 SAS를 돌려봤다고 해서 잘 아는건 아니었고요. SAS에대한 배경지식은 한..10% 정도이었던것 같습니다. 만약 SAS가 전혀 뭔지 모른다고 한다면 준비기간을 늘려야하고요. 저처럼 통계 공부학생이 SAS로 몇번 데이타를 다뤄본 경우 일주일이면 충분할 듯 합니다. 



2. 덤프로 가능한가?

음... 전 크램바이블 덤프로만 공부했습니다. 단순히 패스를 위한 시험공부여서 그랬습니다. 하지만 시험보면서 덤프로만 공부하는거 굉장히 위험한 행동이었구나란 생각을 했어요. 크램바이블 덤프가 대충 70%정도 나온다는 얘길 들었지만 전 한 60% 정도 나왔던것 같아요. 전 덤프를 두번만 훑은 상태였는데 덤프와 똑같은 문제라도 다시 컴퓨터화면으로 다시 보려니 긴가민가 했습니다. 게다가 문제 a,b,c,d 보기 자체가 굉장히 소소하게 다르기때문에 완벽하게 외우지 않는이상 헥깔릴 수밖에 없습니다. 


덤프로 공부한다면, 완벽하게 이해할것!!! (왜 답이고 왜 답이 아닌지를 이해) 그리고 완벽하게 외울것!!을 추천합니다. 


특히 set / merge를 이용해서 데이터 합칠때 어떤 observation이 있는지, observation이 몇개 있는지, variable은 몇개있는지에 관한 문제가 굉장히 많이 나왔습니다. 그래서 이 내용은 필히 알아둬야하고요. log file 보면서 왜 오류가 났는지도 여러개 나왔어요. 


크램바이블에서는 안나왔지만 시험에 나왔던건, 

SAS set 이름으로 적합하지 않은거는 다음중에서 몇개인지 찾는문제 

SAS name에 관한 내용 참고 

http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a000998953.htm


ODS html 은 아니고 ODS PDF, PDF파일로 파일 저장하는 문제 (형식은 html이랑 같습니다만...) 

SAS ODS에 관한 내용 참고 

http://support.sas.com/documentation/cdl/en/odsug/69832/HTML/default/viewer.htm#p14gx25pepks6dn1q9m7vkq3gfoi.htm 


주관식도 4~5?문제 나왔습니다. by구문 이용해서 변수 오름차순으로 정렬하는 코드 적기, observation이 몇개 나오는지, variable 몇개 있는지..나머지는 기억이 안나네요ㅠ 



3. 시험과정

시험장에 가면 ID 두개 제시해야하고요. 사진찍고, 서류에 사인한 뒤 입실했습니다. 시험보는 사람이 한명 더 있었는데요. 뭐 과목도 서로 다르고, 자리도 떨어져있어서 별로 신경쓰이진 않았어요. 문제 풀때 잘 모르겠으면 따로 마크할 수 있는 기능 있고요. 다 끝내기 전, Finish버튼 누르기 전에 Review버튼 눌러서 마크한 질문 다시 살펴볼 수 있습니다. Finish 잘못 눌렀어도 다시 재확인하는 창이 뜨니까 걱정 안하셔도 되고요. 다 풀고 Finish버튼 누를때가 제일 긴장 됩니다ㅠㅠ


그럼 다들 화이팅이예요!! :)  



크램바이블 덤프는 쉽게 다운받을 수 있어서 따로 올려놓지는 않겠습니다. 전 급하게 딴거라 덤프로만 공부했는데요. Advanced는 제대로 공부하려고 합니다. Advanced 공부역시 블로그에 정리하면서 공부할게요~ 



반응형

+ Recent posts