<과제1> 현업이 요청한 레이아웃으로 아래와 같이 최종 결과를 추출하는 sql 작성

 

EMP_NO EMP_NM EMP_
GENDER
COUPLE_YN SPOUSE_NM CHILD
_NM
CHILD_
GENDER
CHILD_BIRTH_YMD CHILD_AGE TWIN_YN
직원번호 직원성명 직원성별 사내부부여부 배우자
이름
자녀이름 자녀성별 자녀
생년월일
자녀나이 쌍생아
여부

 

상세요건

[1] 현재 재직 중인 임직원 중 자녀가 1명 이상인 사람

[2] 자녀의 생년월일이 2012년 1월 1일 ~ 2015년 12월 31일 경우만 대상에 포함

[3] 사내부부이면서 [1],[2] 조건에 만족하는 경우 자녀의 아버지 “직원번호” 기준으로 데이터 추출하고, 어머니는 리스트에서 제거할 것, 이 때 사내부부 여부는 Y로 표시, 배우자성명은 어머니 기준으로 표시

[4] 쌍생아의 경우 2명 모두 지원이 아님, 따라서 쌍생아 중 1명만 포함 시킬 것

[5] 쌍생아 1명을 가져오는 조건은 이름의 오름차순의 상위자로 추출할 것

 


풀이과정

 

: WITH문으로 자녀정보를 담은 테이블과, 사내부부 테이블을 따로 만들어 

 각 테이블을 EMP_C에 조인해서 최종 쿼리를 만드는 방법으로 생각. 

 

CHILD 테이블 

 

- FAM_C 테이블에서 2012년 1월 1일 ~ 2015년 12월 31일 사이에 태어난 자녀(A27) 정보만 담은 테이블

- 쌍생아의 경우 1명만 포함, 1명의 기준은 쌍생아 이름의 오름차순 상위자가 자녀이름에 들어감

 

 SELECT ch.emp_no emp_no
     , ch.fam_nm fam_nm
     , ch.rel_type_cd
     , ch.gender_cd gender_cd
     , ch.birth_ymd birth_ymd
     , tw.emp_no twin_emp_no
     , tw.twin twin_nm
FROM (SELECT *
      FROM FAM_C 
      WHERE rel_type_cd = 'A27'
        AND birth_ymd BETWEEN '20120101' AND '20151231')ch
      LEFT JOIN
     (SELECT FAM1.EMP_NO AS emp_no
           , FAM1.FAM_NM AS twin
      FROM FAM_C FAM1
           INNER JOIN FAM_C FAM2
           ON FAM1.EMP_NO = FAM2.EMP_NO
          AND FAM1.FAM_NM <> FAM2.FAM_NM
          AND FAM1.REL_TYPE_CD = FAM2.REL_TYPE_CD
          AND FAM1.REL_TYPE_CD = 'A27'
          AND FAM1.BIRTH_YMD = FAM2.BIRTH_YMD) tw
       ON ch.emp_no = tw.emp_no
WHERE ch.fam_nm <> tw.twin
  AND fam_nm < tw.twin
   OR tw.twin IS NULL;

 

 

쿼리결과

 

 

COUPLE 테이블 

 

- FAM_REL_C 테이블과 EMP_C테이블로 현재 재직중인 사내부부 중 남편의 정보만 담은 테이블

- 배우자의 성명 컬럼추가 

 

SELECT  hus.emp_no AS h_no
     , hus.emp_nm AS h_nm
     , e2.emp_nm AS w_nm
FROM 
(SELECT e1.emp_no AS emp_no
      , e1.emp_nm AS emp_nm
      , frel.emp_rel_no AS emp_rel_no
FROM fam_rel_c frel
    LEFT JOIN emp_c e1 ON e1.emp_no = frel.emp_no 
WHERE SYSDATE BETWEEN frel.sta_ymd AND frel.end_ymd
     AND SYSDATE BETWEEN e1.hire_ymd AND e1.retire_ymd 
     AND rel_type_cd = 'A18') hus
LEFT JOIN emp_c e2 ON e2.emp_no = hus.emp_rel_no;

 

쿼리 결과

 

 

최종 쿼리

- 사내부부여부, 쌍생아 여부 CASE 조건문 이용

- 자녀 나이는 현재날짜 기준 만나이로 계산 

- '현재 재직중' WHERE 조건문 이용

SELECT em.emp_no AS 직원번호
     , em.emp_nm AS 직원성명 
     , em.gender_cd AS 직원성별
     , (CASE WHEN co.h_no IS NULL THEN 'N' ELSE 'Y' END) AS 사내부부여부
     , co.w_nm AS 배우자성명
     , ch.fam_nm AS 자녀성명
     , ch.gender_cd AS 자녀성별
     , ch.birth_ymd AS 자녀생년월일
     , FLOOR((TO_CHAR(SYSDATE, 'YYYYMMDD') - ch.birth_ymd)/10000) AS 자녀나이
     ,(CASE WHEN ch.twin_nm IS NULL THEN 'N' ELSE 'Y' END) AS 쌍생아여부
FROM emp_c em
 INNER JOIN child ch ON em.emp_no = ch.emp_no
  LEFT JOIN couple co ON em.emp_no = co.h_no 
WHERE SYSDATE BETWEEN em.hire_ymd AND em.retire_ymd
ORDER BY em.emp_no;

 


 

WITH문 포함 

 

WITH couple AS(
SELECT  hus.emp_no AS h_no
     , hus.emp_nm AS h_nm
     , e2.emp_nm AS w_nm
FROM 
(SELECT e1.emp_no AS emp_no
      , e1.emp_nm AS emp_nm
      , frel.emp_rel_no AS emp_rel_no
FROM fam_rel_c frel
    LEFT JOIN emp_c e1 ON e1.emp_no = frel.emp_no 
WHERE SYSDATE BETWEEN frel.sta_ymd AND frel.end_ymd
     AND SYSDATE BETWEEN e1.hire_ymd AND e1.retire_ymd 
     AND rel_type_cd = 'A18') hus
LEFT JOIN emp_c e2 ON e2.emp_no = hus.emp_rel_no)
, child AS (
SELECT ch.emp_no emp_no
     , ch.fam_nm fam_nm
     , ch.rel_type_cd
     , ch.gender_cd gender_cd
     , ch.birth_ymd birth_ymd
     , tw.emp_no twin_emp_no
     , tw.twin twin_nm
FROM (SELECT *
      FROM FAM_C 
      WHERE rel_type_cd = 'A27'
        AND birth_ymd BETWEEN '20120101' AND '20151231')ch
      LEFT JOIN
     (SELECT FAM1.EMP_NO AS emp_no
           , FAM1.FAM_NM AS twin
      FROM FAM_C FAM1
           INNER JOIN FAM_C FAM2
           ON FAM1.EMP_NO = FAM2.EMP_NO
          AND FAM1.FAM_NM <> FAM2.FAM_NM
          AND FAM1.REL_TYPE_CD = FAM2.REL_TYPE_CD
          AND FAM1.REL_TYPE_CD = 'A27'
          AND FAM1.BIRTH_YMD = FAM2.BIRTH_YMD) tw
       ON ch.emp_no = tw.emp_no
WHERE ch.fam_nm <> tw.twin
  AND fam_nm < tw.twin
   OR tw.twin IS NULL
)

 
SELECT em.emp_no AS 직원번호
     , em.emp_nm AS 직원성명 
     , em.gender_cd AS 직원성별
     , (CASE WHEN co.h_no IS NULL THEN 'N' ELSE 'Y' END) AS 사내부부여부
     , co.w_nm AS 배우자성명
     , ch.fam_nm AS 자녀성명
     , ch.gender_cd AS 자녀성별
     , ch.birth_ymd AS 자녀생년월일
     , FLOOR((TO_CHAR(SYSDATE, 'YYYYMMDD') - ch.birth_ymd)/10000) AS 자녀나이
     ,(CASE WHEN ch.twin_nm IS NULL THEN 'N' ELSE 'Y' END) AS 쌍생아여부
FROM emp_c em
 INNER JOIN child ch ON em.emp_no = ch.emp_no
  LEFT JOIN couple co ON em.emp_no = co.h_no 
WHERE SYSDATE BETWEEN em.hire_ymd AND em.retire_ymd
ORDER BY em.emp_no;

 

 

쿼리결과

 

 


 

<과제2>  LISTAGG를 활용하여 직원번호가 10001483 인 자녀의 성명이 한줄로 추출 되도록 SQL작성

 

SELECT EMP_NO AS 직원번호,
       LISTAGG(FAM_NM, ',') WITHIN GROUP(ORDER BY FAM_NM) AS 자녀성명
FROM FAM_C
WHERE EMP_NO = '10001483' 
  AND REL_TYPE_CD = 'A27'
GROUP BY EMP_NO;

 

쿼리결과

 

 

  캠프신청계기  

데이터리안을 처음 알게 된 건 올해 1월 웨비나였다. 

AI웹서비스 동아리를 할 때 운 좋게 데이터리안 세미나를 들을 수 있는 기회가 있었는데

실무에서 데이터분석툴로 SQL을 많이 사용한다는 걸 알 수 있었다.

이후 데이터리안 단톡방에 들어가서 계속 관심을 두다가 직무를 아예 '데이터분석'으로 잡고 바로 생각난 건 데이터리안이었다.

솔직히 취준생에게 가격이 많이 부담되었지만 한번 배울 때 제대로 배우고 싶어서 아예 입문+실전 패키지로 등록했다.

그렇게 5월부터 입문반 수업을 듣게 되었다. 

 

내가 들었던 1월 웨비나 링크

 

[월간 데이터리안 웹 세미나 VOD] 2022년 1월 | 비전공자 4명, 어떻게 데이터 분석가 됐을까? - 인프

비전공자로 데이터 분석가 진로를 희망하고 계신가요? 물류학과, 경영학과, 문창과, 기계공학과 출신인 저희가 어떻게 데이터 분석가가 되었는지 궁금하다면 이 세미나에 힌트가 있습니다., -

www.inflearn.com

 

  수업방식 + 과제   

데이터리안 캠프는 4주동안 주 1회  2시간동안 실시간 온라인 세션이 있고 매주 과제가 있었다. 

참고로 이제 VOD로 바껴서 우리가 실시간으로 수업받는 마지막 기수라고 들었다. 

내가 들은 입문반 실시간 수업은 VOD로 제공되지 않아서 최대한 결석없이 수업시간동안 초집중하려 했다.

어차피 녹화본이 제공되어도 결석하지 않는 이상 다시 안볼 것 같긴 하다........ 

인강도 책도 2번이상 잘 보지 않기 때문에 한번 볼 때 최대한 집중해서 머릿 속에 넣으려고 하는 사람임...ㅎ

 

그리고 수업듣고 후기를 남기면 복습자료를 주는 데 덕분에 복습하기 용이했다.

매주 수업자료, 복습자료 다시 보면서 과제 외로 예습까지는 못해도 복습은 꾸준히 하려고 했다. 

과제는 인프런 초급, 중급강의와 sql 문제풀이, EDA 등이었는데 

인프런 강의를 과제로 들으니까 주1회 수업이 크게 부족하다고 느끼지는 않았다. 

 

 

  추천이유  

4주동안 일단 수업도 듣고 하라는 대로 과제도 했는데 이렇게 하면 정말 데이터분석가가 될 수 있나...? 

내가 지금 올바른 방향으로 가고 있는 건가? 생각이 안들었다면 거짓말이다.

데이터분석과 관련된 실무 경험을 해본 적이 없어서 직무를 준비하는 데 막연함이 항상 있었다. 

 

그런데  데이터리안 입문반 소개 페이지에 '4주 뒤에 이런 일을 할 수 있어요' 에 이렇게 나온다. 

출처:&nbsp;https://www.datarian.io/bootcamp/sql-basic

내가 잘하고 있나 스스로 의심이 들었지만 4주가 지난 뒤 이걸 다시 보니 지금의 난 정말로 4가지를 다 하고 있다.

 

1. SQL로 간단한 데이터 추출 

나는 캠프를 듣기 전에는 SQL툴을 한번도 써본 적이 없는데 지금은 예전에 하던 R, 파이썬 보다 훨씬 편하고 익숙해졌다.

분석까지는 모르겠지만 적어도 질의문을 보고 쿼리를 어떻게 짤 지 고민하고 문법을 작성하는 걸 한달 내내 하다보니 재미도 있고 자신감도 붙었다. (지금 실전반들으면서 다시 자신감하락중이긴 하다...😂)

적어도 이력서에 SQL을 다룰 줄 안다고 쓸 수 있게 된 건 확실하다. 

 

2. 해커랭크, 리트코드 등 코딩 플랫폼에 익숙해짐

강의 실습으로 해커랭크, 리트코드,solvesql 코딩플랫폼을 이용한다. 뿐만 아니라 입문반 수업에서 원하는 사람들은 신청받아 스터디를 구성해줬는데 스터디를 하면서 해커랭크에 있는 대부분의 문제는 거의 다 푼 것 같다. 그 기록은 이 블로그에 'SQL문제풀이' 카테고리에도 있다.  이런 코딩플랫폼에 익숙해짐으로써 나중에 SQL 코딩테스트에 대비할 수 있다고 한다.

 

3. SQL을 실무에 활용할 수 있음

아직 취준중이라 실무에서 사용하고 있다고 말하기 어렵지만 배운 분석 내용을 바탕으로 프로젝트를 하려고 하고 있다. 그리고 입문반 3주정도 지났을 때 부터 다른 곳에서 직무부트캠프를 추가로 들었는데 실무자가 알려주는 분석을 위한  SQL문법 내용 중 90%이상은 이미 데이터리안 입문반수업으로 알고 있는 문법이었다. 

 

4. 남이 작성한 SQL쿼리를 읽고 이해/수정 할 수 있음

SQL스터디를 하면서 다른 사람의 쿼리를 읽을 수 있었고 특히 해커랭크 문제 풀 때 도저히 안 풀리면 풀이를 검색하거나 Discussion부분을 보면서 남이 작성한 쿼리를 자주 봤는데  내가 모르는 문법, 함수가 나와도 당황하지 않고, 구체적으로는 몰라도 전체적인 흐름, 왜 이사람이 이렇게 쿼리를 작성했는지는 알 수 있게 되었다.  

(당황하지 않고 천천히 쿼리를 뜯어보려고 하는 습관은 데 정말로 데이터리안의 강의력이 뛰어난 덕분이라고 생각한다.)

 

추가로 캠프를 들으면서 비슷한 직무를 준비하는 사람들을 만날 수 있어서 좋았다.

나는 지금 데이터리안에서 다른 수강생분들과 SQL스터디, 기초 통계학 스터디를 같이 하고 있다.

그리고 캠프 수강생은 월간세미나가 무료인데 데이터리안 블로그+ 유튜브+ 세미나까지 양질의 콘텐츠를 제공받을 수 있는 점이 정말 좋다.  

또한 슬랙으로 언제든지 질문을 올릴 수 있는 게 편리하다. 나는 사실 구글링으로 대부분 해결하는 편이라 질문답변 채널을 잘 이용하지는 않았지만 그래도 언제든 편하게 질문할 수 있는 창구가 있냐 없냐는 다르다고 생각한다.   

심지어 이 슬랙은 캠프가 종료되어도 이용할 수 있다. 혼자서 공부할 때는 질문할 곳이 막막한데 슬랙에서 질문하거나 프로젝트 피드백도 받을 수 있다. 

 

 

아쉬웠던 점 

나는 '데이터분석'을 경험하고 싶었는데 아무래도 입문반이다 보니까 SQL문법 위주의 수업이었다.  RFM분석, 매출분석은 3,4주차 세션이 거의 끝나갈 때쯤 배웠어서 아쉬움이 있다. 

입문반을 듣고 SQL에는 익숙해졌지만 막상 프로젝트를 하고 포트폴리오 작성을 하는데는 여전히 막막하다.

다른 분들한테도 물어보니 아직 다들 막막하다 하는 걸 보니 나만 그렇게 느끼는 것 아닌 것 같다. 

반면에 실전반은 언어보다 분석위주라고 해서 기대 중이다.

 

내가 처음 등록할 때 고민했던 부분은 인프런에 데이터리안 강의가 있는데 굳이 데이터분석 캠프를 들어야 하는 이유를 제대로 파악하기 어려웠다. 이번에 캠프가 전부 VOD로 바껴서 더욱이 나와 비슷한 고민을 하는 사람이 있을 것 같다.

만일 패키지를 들을 지, 실전반만 들을 지 고민 중이라면,

 

금전적으로 여유가 있다면 패키지를 추천한다. 

캠프를 들으면 매주 규칙적으로 공부할 수 있고 진도, 공부분량 등 다 정해주고 그에 따른 적절한 콘텐츠도 큐레이팅 해주기 때문에 캠프로 듣는 것이 확실히 편하고 꾸준히 공부할 수 있다. 특히나 나같이 인강만으로는 규칙적으로 공부하기 어려운 사람이라면 말이다. 

그러나 혼자서 인강도 계획적으로 잘 듣고, 문제도 추가로 찾아서 풀 수 있는 사람이라면 

인프런에 있는 데이터리안 초급, 중급 강의로 SQL 언어를 독학하고 실전반 캠프를 들으며 분석을 배우고 프로젝트를 하는 것도 좋지 않을까 생각이 든다.

 

마지막으로 데이터리안이 어떤 곳인지 아직 잘 모르겠다면 데이터리안 블로그 글을 읽는 걸 강추한다.

좋은 글들이 많고 나도 블로그 글을 읽으면서 캠프에 대한 신뢰성(?)이 생겨 등록할 수 있었다. 뿐만 아니라 유튜브도 있으니 충분히 찾아보고 고민해보시길 바란다. 

https://www.datarian.io/blog

 

블로그

 

www.datarian.io

https://youtu.be/l4_axJ8KKos


친구추천 이벤트로 데이터리안 데이터분석캠프 등록할 때 추천인을 '5기 티나'라고 써주시면 

추천받은 사람은 5만원 환급, 추천한 사람은 데이터리안 강의 1개를 무료로 제공받을 수 있습니다!

 

참여 방법

추천 받으신 분

1. 데이터리안 웹사이트를 통해 SQL 데이터 분석 캠프를 등록해주세요.
2. 신청 폼의 [기존 수강생 추천을 받으신 경우, 추천하신 분의 수강 기수와 성함(혹은 닉네임)을 적어주세요.] 문항을 적어주세요.

이벤트출처: 데이터리안 


마지막으로 수료증으로 인증하며 포스팅 마무리하겠습니다 :) 

 

문제: 질의 결과처럼 데이터를 추출 할 수 있도록 sql 작성 

 

1)생년월일이 20120101 에서 20151231 사이인 쌍둥이 자녀를 가진 임직원을 구하세요.
 
[주어진 질의결과]

 

[SQL 코드]

SELECT  f1.emp_no AS 직원번호
      ,f1.fam_nm AS 쌍둥이1
      ,f2.fam_nm AS 쌍둥이2
FROM 
  (SELECT *
   FROM fam_c
   WHERE birth_ymd BETWEEN '20120101' AND '20151231'
   AND rel_type_cd = 'A27') f1
   ,fam_c f2
WHERE f1.emp_no = f2.emp_no
      AND f1.birth_ymd = f2.birth_ymd
      AND f1.fam_nm <> f2.fam_nm;
[제가 한 질의결과]


 

2) . 20210321 기준으로 재직중인 임직원이며. 생년월일이 20120101 에서 20151231인 자녀를 가진 임직원을 구하는 sql을 작성하세요.

 

[주어진 질의결과]

[SQL 코드]

SELECT  e.emp_no AS 직원번호
      ,f.fam_nm AS 자녀성명
      ,f.birth_ymd AS 자녀생년월일 
FROM emp_c e
   INNER JOIN fam_c f on e.emp_no = f.emp_no
WHERE e.retire_ymd >= '20210321' 
     AND f.birth_ymd BETWEEN '20120101' AND '20151231'
     AND f.rel_type_cd = 'A27';

[제가 한 질의결과]


3) . 20210321 기준으로 재직중인 임직원이며. 사내부부인 임직원의 직원번호를 구하는 sql을 작성하세요.

 

[주어진 질의결과]

[SQL 코드]

SELECT e.emp_no AS EMP_NO
FROM emp_c e
    INNER JOIN fam_rel_c fam_r ON e.emp_no = fam_r.emp_no
WHERE e.retire_ymd >= '20210321' 
     AND fam_r.end_ymd >= '20210321' 
     AND fam_r.rel_type_cd IN ('A02', 'A18')

 

[제가 한 질의결과]


3-2) . 현재 날짜 기준 재직중인 “이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.

 

[SQL 코드]

SUBSTR  사용

SELECT emp.emp_no AS 직원번호 
     , emp.emp_nm AS 직원명
     , COUNT(*) AS 자녀명수
FROM emp_c emp
    INNER JOIN fam_c fam ON emp.emp_no = fam.emp_no
WHERE SUBSTR(emp.emp_nm, 1, 1) = '이'
      AND SYSDATE BETWEEN HIRE_YMD AND RETIRE_YMD
      AND rel_type_cd = 'A27'
GROUP BY emp.emp_no, emp.emp_nm ;

 

LIKE 사용 

SELECT emp.emp_no AS 직원번호 
     , emp.emp_nm AS 직원명
     , COUNT(*) AS 자녀명수
FROM emp_c emp
    INNER JOIN fam_c fam ON emp.emp_no = fam.emp_no
WHERE emp.emp_nm LIKE '이%'
      AND SYSDATE BETWEEN HIRE_YMD AND RETIRE_YMD
      AND rel_type_cd = 'A27'
GROUP BY emp.emp_no, emp.emp_nm ;

 

[제가 한 질의결과]

 


 

3-3) . 자녀 명수가 2명 이상인 직원의 리스트를 구하세요.  (직원번호 / 성명 / 자녀명수 ) 

 

[SQL 코드]

SELECT e.emp_no AS 직원번호
      ,e.emp_nm AS 직원성명
      ,COUNT(*) AS 자녀명수
FROM emp_c e
     INNER JOIN fam_c f ON e.emp_no = f.emp_no 
WHERE f.rel_type_cd = 'A27'
GROUP BY e.emp_no, e.emp_nm
HAVING  COUNT(*) >= 2;

[제가 한 질의결과]


 

3-4) . 현재 기준 조직의 부서별 직원이 몇 명인지 구하는 sql을 작성하세요. (조직코드, 조직명, 직원수)

 

[SQL 코드]

SELECT org.org_cd AS 조직코드 
     , org.org_nm AS 조직명
     , COUNT(emp.emp_no) AS 직원수
FROM org_c org
     INNER JOIN emp_c emp ON emp.org_cd = org.org_cd
WHERE SYSDATE BETWEEN STA_YMD AND END_YMD
GROUP BY org.org_cd, org.org_nm;

 

[제가 한 질의결과]

<과제 목표>

현업이 제출한 데이터 추출 요청서를 확인 후 요구사항의 애매모호성 제거하여 데이터 추출 작업 준비하기.

 

 

상황

내년부터 우리 회사에 직원 복지항목으로 자녀 학자금에 대한 지원이 추가됨.

관련하여 인사팀에서 현황을 파악하고자 관련 데이터 추출을 요청함.

 


1. 현업의 요구사항을 모두 파악 후 추출하려는 데이터의 레이아웃을 그려보세요

직원번호 직원성명 사내부부여부 직원의
자녀수
자녀성명 자녀성별 자녀
생년월일
자녀나이 자녀순서 쌍생아
여부

*자녀순서는 몇 번째 자녀인지 의미 

 

데이터는 은퇴한 직원의 정보도 담고 있지만 재직 중인 임직원을 대상으로 하는 복지혜택이기 때문에 재직여부는 필요없을 것 같다.  

 

FEEDBACK 이후

직원번호 직원성명 직원성별 사내부부여부 배우자
성명
자녀성명 자녀성별 자녀생년월일 자녀나이  쌍생아
여부
EMP_C EMP_C EMP_C FAM_REL_C FAM_REL_C
EMP_C
FAM_C FAM_C FAM_C FAM_C FAM_C
EMP_NO EMP_NM GENDER_CD EMP_REL_NO EMP_REL_NO, EMP_NM FAM_NM GENDER_CD BIRTH_YMD BIRTH_YMD REL_TYPE_CD

 

2열: 테이블

3열: 컬럼


2. 애매모호한 부분에 밑줄을 긋고 어떻게 명확히 할 지 수정해 보세요.

직원 복지향상을 위해 내년부터 아동 자녀 학자금을 지원하려 대상자를 확인하려 합니다.

전체 임직원 중

- 기혼의 임직원 중 자녀가 1명 이상의 인 자
- 자녀 나이가 5~7세인자
-배우자가 사내부부인 경우는 남편, 아내 중 한쪽만 가능
- 배우자가 사내부부인 경우 배우자 명을 표시
- 해당자녀의 나이, 성별표시
- 쌍생아의 경우 대표 1명만 표시

 

- 기혼의 임직원 중 자녀가 1명 이상의 인 자

미혼모, 미혼부도 있을 수 있다 생각.

재작자중 자녀코드를 가지고 있고 자녀가 1명이상이면 기혼으로 간주

 

- 자녀 나이가 5~7세인자

나이의 기준이 만나이인지 세는 나이(한국식나이)인지 연나이인지 애매모호함

또한 만나이를 기준으로 삼을 경우 어느 날짜를 기준으로 만나이를 할 것인지도 부정확함

만나이로 할 경우에는 "2022년 01월 01일 기준으로 만5~7세 자녀"로 기준 세우는 것이 명확함.

그리고 나이보다 출생연도를 기준으로 세우는 것도 명확하다고 생각.

예를 들어 2022년 기준으로 한국식 나이 5세~7세에 해당되는 "2016년 01월 01일 ~ 2018년 12월 31일 사이 출생자"


- 해당자녀의 나이, 성별표시

마찬가지로 나이의 기준이 애매모호함.

만나이, 연나이, 세는나이(한국식나이) 기준 명확화 필요

나이, 생년월일, 성별 추출


- 쌍생아의 경우 대표 1명만 표시

쌍생아의 기준: 관계코드가 자녀이면서 생년월일이 같은 경우

쌍생아 대표의 기준이 애매모호함. 

쌍생아의 경우에도 자녀 순서가 나뉘어 있음. 쌍생아 중 첫째를 대표로 표시 

또는 이름으로 오름차순 기준, 상위자로 추출,

 

 

+ 추가사항

- 2명이상의 자녀가 나이기준에 충족될 경우에 혜택 중복 여부 -> 나이가 더 많은 자녀를 대표 1명으로 표시 

- 임직원의 연차기준에 따른 복지혜택 적용 여부 -> 입사연도 상관없이 모든 임직원 복지적용 or 입사한 지 2년이상된 직원부터 복지 적용 등 기준세우기

 

FEEDBACK 이후 추가

배우자가 사내부부인 경우는 남편, 아내 중 한쪽만 가능

사내커플인 경우 부를 대상자에 포함하고 모는 제외

 

 배우자가 사내부부인 경우 배우자 명을 표시

대상자 부 기준으로 모의  직원번호 및 배우자 명을 함께 추출

 


3. SQL을 사용하여 문제에 답하세요.

(1) 직원번호 10004141 의 이름은

SELECT emp_no, emp_nm
FROM emp_c
WHERE emp_no = 10004141;

결과

(2) 직원번호 10004141 는 몇 명의 가족이 있나요? 

SELECT COUNT(emp_no)
FROM fam_c
WHERE emp_no = 10004141;

결과

(3) 직원번호 10004141 의 소속 부서 코드는

SELECT org_cd
FROM emp_c
WHERE emp_no = 10004141;

결과

(4) 직원번호 10004141 의 소속 부서 명은?  

SELECT org_nm
FROM org_c
WHERE org_cd = (
  SELECT org_cd
  FROM emp_c
  WHERE emp_no = 10004141
);

결과

(5) 남자 / 여자 직원이 몇 명인지 한번에 알 수 있는 sql 작성

SELECT gender_cd, COUNT(*)
FROM emp_c
GROUP BY gender_cd
ORDER BY gender_cd

(6) 직원별 자녀가 몇 명인지 한번에 알 수 있는 sql 작성

SELECT emp_no, COUNT(*) AS 자녀수
FROM fam_c
WHERE rel_type_cd = 'A27'
GROUP BY emp_no;

 

결과

(7) 생년월일이 197011일 이전인 직원의 수를 구하는 sql 작성

SELECT COUNT(emp_no)
FROM emp_c
WHERE birth_ymd < 19700101

결과

(8) 현재 재직 중인 직원의 전체 수를 구하는 sql 작성

SELECT COUNT(emp_no)
FROM emp_c
WHERE retire_ymd LIKE '9999%'
SELECT COUNT(emp_no)
FROM emp_c
WHERE retire_ymd = '9999/12/31'

결과

 

 

과제1) 이번 캠프에 사용되는 4개의 테이블에 대해서 탐색해 보고 그 결과를 기술하여 보세요.
과제 목적: 데이터 및 테이블의 전략적 탐색능력 배양


EMP_C

SELECT * FROM EMP_C;

 

사용목적임직원의 입사 및 은퇴 정보가 저장된 테이블

 

특징 

1. 사번,직원이름,성별,생년월일, 부서코드,은퇴일자,고용일자 정보가 저장됨

2. 사번(EMP_NO)은 중복되지 않는 식별번호

3. 성별은 1, 2 로 분류

4. 사원 당 하나의 행을 가짐 

5. RETIRE_YMD에서 9999년은 지금도 다니고 있는 걸로 추정 

 


FAM_C

SELECT * FROM FAM_C;

사용목적: 임직원의 가족정보가 저장된 테이블

 

특징

1. 사번, 가족이름, 관계코드, 성별, 생년월일 등 정보가 저장됨

2. 부모, 자식, 형제 등 가족관계가 코드로 저장

3. EMP_C 테이블의 EMP_NO와 연관

4. 가족의 성별은 ‘1’, ‘2’ 로 분류

SELECT EMP_NO , COUNT(*) FROM FAM_C GROUP BY EMP_NO;

5. 임직원 한 명(사번)당 여러 행을 가질 수 있음

    -> 임직원 한 명당 가족 1명부터 최대13명까지 가족의 정보가 담겨 있음

SELECT rel_type_cd, child_seq FROM FAM_C WHERE child_seq IS NOT NULL;

6.  CHILD_SEQ 속성값이 있는 REL_TYPE_CD는 A27

   -> A27은 자녀 코드, CHILD_SEQ 컬럼은 자녀 순서(첫째,둘째,셋째)로 추정

 


ORG_C

SELECT * FROM ORG_C;

사용목적: 회사의 부서(지점) 정보가 저장된 테이블

 

특징

1. 부서코드, 부서이름, 지점타입, 시작날짜, 종료날짜 등 정보가 저장됨

  -> SUPER_ORG_CD, MGR_ORG_CD, AREA_ORG_CD 가 무슨 속성인지 정확히는 모르겠지만

      MGR_ORG_CD는 관리자부서코드, AREA_ORG_CD는 지역코드로 추정됨.

2. 각 지점이 코드로 저장

3. EMP_C 테이블의 ORG_CD와 연관됨

SELECT org_type FROM ORG_C GROUP BY org_type ORDER BY org_type;

4. 지점은 A~N, 11개의 타입으로 나뉨

5. 코드, 이름이 동일한 지점이 여러 행을 가질 수 있음


FAM_REL_C

SELECT * FROM FAM_REL_C;

 

사용목적: 가족 중에 임직원이 있는 경우, 직원과 해당 가족정보가 저장된 테이블

 

특징

1.EMP_C테이블의 EMP_NO, FAM_C 테이블의 REL_TYPE_CD와 연관됨
2. EMP_REL_NO는 임직원 가족의 직원번호 
   -> EMP_NO와 EMP_REL_NO의 속성값이 EMP_C테이블의 EMP_NO에 있어야  데이터 정합성이 맞다고 볼 수 있음
SELECT emp_no, COUNT(*) FROM FAM_REL_C GROUP BY emp_no;
3.한 사원이 여러 행을 가질 수 있음
   -> 한 사원의 임직원 가족이 여러명인 의미로 추정 

FEEDBACK 

1.org_c 테이블에서 super_org_cd, mgr_org_cd의 역할은?

   --> super_org_cd는 가장 상위 부서, mgr_org_cd는 해당 지점(부서)을 관리하는 관리기관 코드로 추정됩니다.  

 

2.org_c 테이블에서 end_ymd99991231 인 값은 어떤 의미인지?

 --> 현재 해당 지점이 계속 운영 중(종료되지 않음)인 것으로 해석됩니다. 

 

3.child_seq는 어떤 기능을 하는지? child_seqnull 값이라면 어떤 의미인지?

가족의 생년월일과 직원의 생년월일을 비교했을 때 child_seq는 자녀의 순서로 추정됩니다.

속성값이 1인 경우 '첫째', 2인 경우 '둘째', 3인 경우'셋째' 자녀의 정보입니다.

하지만 속성값이 '0'인 경우는 생년월일이 달라도 0으로 나오는 정보가 있기 때문에

외동이거나 혹은 해당 자녀의 순서를 모르는 경우라고 추측해봅니다... 

 

rel_type_cd에서 A27외 다른 코드는 child_seq가 null로 나옵니다.

이는 A27은 자녀 코드이고 그 외는 부모,배우자, 형제 등 자녀 순서와 관련 없는 가족의 정보를 의미합니다. 

 

+ Recent posts