백신 맞고 심심해서 풀다보니 고득점 키트를 다 풀어버렸다.
문제는 다 Oracle로 풀었다는 점..?
정답이긴 해도 효율 생각안하고 직관적으로 풀어버려서 맘에 안들긴하는데
지금 노트북에는 오라클을 안깔아둬서 어쩔 수 없다.
저 중에서 어느정도 난이도 있는 문제와 개인적인 코드 리뷰를 적어볼까한다.
1. GROUP BY - 입양 시간 구하기(1)
데이터가 많은 경우 TO_CHAR, TO_DATE같은 함수로 데이터 내용 일부를 추출하거나 변환할 때 시간이 많이 걸려서
그 횟수를 줄이고자 아래와 같이 짰고 BETWEEN AND 를 안 쓴 이유는 포함여부가 헷갈리는 것을 막기 위함이다.
--입양 시각 구하기(1)
SELECT HOUR,COUNT(HOUR) AS COUNT
FROM (
SELECT
TO_CHAR(DATETIME,'HH24') AS HOUR
FROM ANIMAL_OUTS
)
WHERE HOUR >= 9 AND HOUR <20
GROUP BY HOUR
ORDER BY HOUR ASC
2. GROUP BY - 입양 시간 구하기(2)
이게 만약 손코딩이였다면 엄청 헷갈렸을 것 같다.
조인 개념으로 풀긴했는데 사실 가독성이 떨어지고 함수도 많이 써서 그닥 맘에 드는 코드는 아니지만
다 풀고 질문을 봐도 그렇게 괜찮아보이는 코드가 없긴했다.
SELECT A.HOUR,NVL(B.COUNT,0) AS COUNT
FROM
(SELECT LEVEL-1 AS HOUR
FROM DUAL
CONNECT BY LEVEL<= 24) A,
(SELECT TO_CHAR(DATETIME,'HH24') AS HOUR,
COUNT(TO_CHAR(DATETIME,'HH24')) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME,'HH24')) B
WHERE A.HOUR = B.HOUR(+)
ORDER BY A.HOUR
---1단계
SELECT HOUR,COUNT(HOUR) AS COUNT
FROM
(
SELECT TO_CHAR(DATETIME,'HH24') AS HOUR
FROM ANIMAL_OUTS
)
GROUP BY HOUR
ORDER BY HOUR
3. IS NULL - NULL 처리하기
NVL을 쓰면 편하다를 보여주려고 case로도 코드를 짜봤다.
--case then
SELECT ANIMAL_TYPE,
CASE WHEN NAME IS NULL
THEN 'No name'
ELSE NAME
END AS NAME,SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
--NVL
SELECT ANIMAL_TYPE,
NVL(NAME,'No name') AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
4. JOIN - 오랜 기간 보호한 동물(1)
더 잘 짤 수도 있을 거같은데 별 생각이 나질 않아서 누가 훈수 좀 뒀으면 좋겠다.
NOT IN으로 짠 사람도 있던 데 그렇게 하면 IN 안에 내용을 하나씩 다 비교해야하기 때문에 비추다.
SELECT *
FROM
(SELECT AI.NAME,AI.DATETIME
FROM ANIMAL_INS AI,ANIMAL_OUTS AO
WHERE AI.ANIMAL_ID = AO.ANIMAL_ID(+)
AND AO.ANIMAL_ID IS NULL
ORDER BY AI.DATETIME ASC
)
WHERE ROWNUM <= 3
5. JOIN - 보호소에서 중성화한 동물
들어올 때랑 나갈 때의 중성화 여부가 다름으로 조건 걸어서 푸는 거 보고 발상이 대단하다고 생각했다.
이런 경우 NULL값이 들어갈 수 있는 지를 확인하는 것이 제일 중요할 것 같다.
SELECT AI.ANIMAL_ID, AI.ANIMAL_TYPE, AI.NAME
FROM ANIMAL_INS AI, ANIMAL_OUTS AO
WHERE AI.ANIMAL_ID = AO.ANIMAL_ID
AND AI.SEX_UPON_INTAKE LIKE 'Intact%'
AND (AO.SEX_UPON_OUTCOME LIKE 'Spayed%'
OR AO.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY AI.ANIMAL_ID ASC
--간단하게
SELECT AI.ANIMAL_ID, AI.ANIMAL_TYPE, AI.NAME
FROM ANIMAL_INS AI, ANIMAL_OUTS AO
WHERE AI.ANIMAL_ID = AO.ANIMAL_ID
AND AI.SEX_UPON_INTAKE != AO.SEX_UPON_OUTCOME
ORDER BY AI.ANIMAL_ID ASC
6. String,Date - 중성화 여부 파악하기
case then 쓰고 like로 조건 거는 건 자주 쓰이는 거라 봐두면 좋겠다 싶어서 남겨본다.
SELECT ANIMAL_ID,NAME,
CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%'
OR SEX_UPON_INTAKE LIKE 'Spayed%'
THEN 'O'
ELSE 'X'
END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
'취준일지 > SQLD' 카테고리의 다른 글
[SQLD] 1.2 엔터티 (0) | 2021.11.03 |
---|---|
[SQLD] 1.1 데이터 모델링의 이해 (0) | 2021.11.03 |
[SQLD] 공부 계획, 게시물 링크 모음 (0) | 2021.11.02 |
[SQLD] 자료 링크 모음 (0) | 2021.10.29 |
[SQLD] SQLD란?(신청 방법,시험 과목, 합격 기준) (3) | 2021.10.28 |