https://github.com/neverGiveUpppppp/Comento_SQL_Oracle
- 추출조건 : 현재 재직중인 직원의 생년월일이 2012년 1월 1일 부터 2015년 12월 31일 인 자녀 모두추출.
- 추출조건2 : 쌍둥이의 경우 두명 모두 추출하고, 쌍둥이 여부에 ‘Y’ 표시 요망.
- 추출조건3 : 사내부부인 경우도 예외 없이 직원과 자녀를 모두 추출하고, 이 때 상대 배우자의 직원번호를 추출 요망.
- 추출 요청 컬럼 → 직원번호 / 직원성명 / 배우자성명 (사내부부일 때만) / 배우자직원번호 / 자녀성명 / 자녀성별 / 자녀생년월일 / 쌍생아여부
힌트
SELECT
EMP.EMP_NO AS 직원번호
,EMP.EMP_NM AS 직원성명
,-- --> ★★★ 배우자 직원번호 완성하세요!!
,FAM.FAM_NM AS 자녀성명
,FAM.GENDER_CD AS 자녀성별
,FAM.BIRTH_YMD AS 자녀생년월일
,-- --> ★★★ CASE WHEN을 사용하여 쌍둥이 여부를 표시해보세요.
FROM EMP_C EMP,
FAM_C FAM,
FAM_REL_C FAMR,
(
SELECT
TWIN1.EMP_NO
,TWIN1.FAM_NM AS TWIN1
,TWIN2.FAM_NM AS TWIN2
FROM
FAM_C TWIN1 , FAM_C TWIN2
WHERE TWIN1.EMP_NO = TWIN2.EMP_NO
AND TWIN1.REL_TYPE_CD = TWIN2.REL_TYPE_CD
AND TWIN1.REL_TYPE_CD = 'A27'
AND TWIN2.REL_TYPE_CD = 'A27'
AND TWIN1.FAM_NM <> TWIN2.FAM_NM-- 이름이 다른 조건
AND TWIN1.BIRTH_YMD = TWIN2.BIRTH_YMD -- 생년월일이 같을 조건
) TWIN
WHERE EMP.EMP_NO = FAM.EMP_NO
AND -- --> ★★★ 현재 재직자만 추출 되도록 조건을 넣으세요.
AND FAM.REL_TYPE_CD = 'A27'
AND -- --> ★★★ 2012년 1월 1일 부터 2015년 12월 31일 생년월일 조건을 넣으세요.
AND EMP.EMP_NO = FAMR.EMP_NO (+)
AND FAMR.REL_TYPE_CD (+) IN ('A02','A18')
AND EMP.EMP_NO = TWIN.EMP_NO (+)
AND FAM.FAM_NM = TWIN.TWIN1 (+)
;
조건 brainstorming
재직중 : RETIRE 99/12/31 조건
자녀 생년월일 2012.01.01~2015.12.31 : BETWEEN 20120101 AND 20151231
쌍둥이의 경우 두명 모두 추출 : FAM_C SELF JOIN FAM_NM을 F1,F2 따로 조회 및 조건에 NM <>추가
쌍둥이 여부 표시 'Y' : 리터럴 작성
사내부부의 경우, 상대 배우자의 직원번호 추출 : ?
조회 목록 : EMP_NO, EMP_NM, CASE(SPOUSE_EMP_NO 사내부부일때,일반일때), CHILD_NM, CHILD_GENDER, CHILD_BIRTH_YMD, TWIN_YN
(직원번호 / 직원성명 / 배우자성명 (사내부부일 때만) / 배우자직원번호 / 자녀성명 / 자녀성별 / 자녀생년월일 / 쌍생아여부)
--- 추출조건1
--- 현재 재직중인 직원의 생년월일이 2012년 1월 1일 부터 2015년 12월 31일 인 자녀 모두추출
SELECT *
FROM FAM_C
WHERE REL_TYPE_CD = 'A27'
AND BIRTH_YMD BETWEEN 20120101 AND 20151231
;
--- 추출조건2
--- 쌍둥이의 경우 두명 모두 추출하고, 쌍둥이 여부에 'Y' 표시 요망
SELECT F1.EMP_NO 직원번호, F1.FAM_NM 쌍둥이1, F2.FAM_NM 쌍둥이2, 'Y' "쌍둥이 여부"
FROM FAM_C F1
JOIN FAM_C F2 ON(F1.EMP_NO = F2. EMP_NO)
AND F1.FAM_NM <> F2.FAM_NM
AND F1.REL_TYPE_CD = 'A27'
AND F1.REL_TYPE_CD = F2.REL_TYPE_CD
AND F1.BIRTH_YMD = F2.BIRTH_YMD
;
--- 추출조건1 + 추출조건2
--- 현재 재직중인 직원의 생년월일이 2012년 1월 1일 부터 2015년 12월 31일 인 자녀 모두추출
--- 쌍둥이의 경우 두명 모두 추출하고, 쌍둥이 여부에 'Y' 표시 요망
SELECT *
FROM FAM_C
WHERE REL_TYPE_CD = 'A27'
AND BIRTH_YMD BETWEEN 20120101 AND 20151231
;
SELECT F1.EMP_NO 직원번호, F1.FAM_NM 쌍둥이1, F2.FAM_NM 쌍둥이2, 'Y' "쌍둥이 여부"
FROM FAM_C F1
JOIN FAM_C F2 ON(F1.EMP_NO = F2. EMP_NO)
AND F1.FAM_NM <> F2.FAM_NM
AND F1.REL_TYPE_CD = 'A27'
AND F1.REL_TYPE_CD = F2.REL_TYPE_CD
AND F1.BIRTH_YMD = F2.BIRTH_YMD
;
-- FROM절의 AND조건들을 WHERE절로 돌려서 넣으면 뭐가 다를까?
SELECT F1.EMP_NO 직원번호, F1.FAM_NM 쌍둥이1, F2.FAM_NM 쌍둥이2, 'Y' "쌍둥이 여부"
FROM FAM_C F1
JOIN FAM_C F2 ON(F1.EMP_NO = F2. EMP_NO)
WHERE F1.FAM_NM <> F2.FAM_NM
AND F1.REL_TYPE_CD = 'A27'
AND F1.REL_TYPE_CD = F2.REL_TYPE_CD
AND F1.BIRTH_YMD = F2.BIRTH_YMD
;
2) LISTAGG를 활용하여 직원번호가 10001483 인 자녀의 성명이 한줄로 추출 되도록 SQL을 작성해 보세요
HINT : LISTAGG 활용 --> https://gent.tistory.com/328
'small steps > 1일 1코딩 - 코딩을 내 몸처럼' 카테고리의 다른 글
[1일1코딩][코딩테스트] 백준 14681번 : 사분면 고르기(not solved) (0) | 2022.10.09 |
---|---|
[1일1코딩][코딩테스트] 입력값 조건 받아서 받는 코드 (0) | 2022.10.08 |
[1일1코딩][Oracle] 문제풀이 : 쌍둥이 추출, 쌍둥이여부 'Y', 재직중인 직원의 특정 생년월일 자녀 구하기 (0) | 2022.10.02 |
[1일1코딩][Java] Collection Map 2st practice (1) | 2022.09.30 |
[1일1코딩][Java] switch문 + 다른 메소드 호출 (0) | 2022.09.29 |