Sister Nosilv story

[TIL 12th] SQL코드카타, Case when이 최선이 아닌 문제

by 노실언니

진행상황 

 Complete | `웹개발종합반` 완강

 Complete | `엑셀보다 쉽고 빠른 SQL` 완강

 Complete | 사전캠프 미션 `SQL 퀘스트`완료

 Complete | 1차시 팀 미니 프로젝트 개발완료

 Complete | 내일배움캠프 Spring 5기 사전캠프 (24.11.18.月 ~ 24.12.20.金─총 33일 / 14:00~18:00 ─일일 4시간)

 In progress | 내일배움캠프 Spring 5기 본캠프 (24.12.23.月 ~ 25.05.06.火 ─총 135일 / 9:00~21:00─일일 12시간)

 In progress | 국취제Ⅰ2회차 (24.12.13 ~ 25.01.12)

 In progress | 자바 `Java 문법 종합반` 강의 듣기 NEW

 In progress | 자바 혼공자바 읽기 & 퀘스트 하기

 In progress | 코테 C++ 자료구조, 알고리즘 책 읽기

 In progress | GIT 얄코의 깃/깃허브 책 읽고 실습 / 깃 특강 복습 NEW

 To-do |얄코의 HTML/CSS/JS 책 읽기

 To-do | DB 입문/실무 - 국민대 김남규 교수님 강의 듣기 & SQLD자격증챌린지 & SQL 자격검정 실전문제 풀기 


6조가 되었다 / 우리 조는 다 찢어졌어요 흐그흐

부캠이 2챕터로 넘어가면서 조가 바뀌었다

우리 조는 모든 조원이 다 후루룩 다른 조로 들어갔다

나는 6조가 되었다

새로운 사람 새로운 테이블 아주 조으아써


배운 것

1) 코드카타 SQL : CASE/WHEN이 많아지는 건 별로야 → 몫 or 버림

간단 요약

 다양한 price값을 만 원 단위로 그룹화하는 과정을

 case/when 으로 그룹화하면 단순반복코드가 많아진다.

 또한 when의 범주를 초과/미달하는 price 값은 처리가 불가능했다.

 이 두 문제를 해결하기 위해서 case/when을 쓰지 않는 방향을 찾아보았고

 몫 연산자 div나 버림함수 truncate 를 사용하여 해결하였다.

 

푼 문제와 실행결과 : https://school.programmers.co.kr/learn/courses/30/lessons/131530

아래 코드 4개의 결과는 전부 같고 정답처리된다.

첫 번째 코드

코드 설명 의식의 흐름대로 씀

특징 case 문(9개의 when)과 서브쿼리 사용

의문 1. 굳이 이렇게 많이 when 를 만들어야 하나? + price에 9만, 10만대도 생기면 또 만들어야 하는데

의문 2. 굳이 서브쿼리를 사용해야 하나? → 두 번째 코드는 일단 이걸 해결하는 방향으 

select pr.PRICE_GROUP, count(pr.PRODUCT_ID) as PRODUCTS
from (
    SELECT  PRODUCT_ID, price,
            case
                when(price< 10000) then 0
                when(PRICE>=10000 and price <20000) then 10000
                when(PRICE>=20000 and price <30000) then 20000
                when(PRICE>=30000 and price <40000) then 30000
                when(PRICE>=40000 and price <50000) then 40000
                when(PRICE>=50000 and price <60000) then 50000
                when(PRICE>=60000 and price <70000) then 60000
                when(PRICE>=70000 and price <80000) then 70000
                when(PRICE>=80000 and price <90000) then 80000
            end AS PRICE_GROUP
    from product ) as pr
group by 1
order by 1

 

두 번째 코드

코드 설명 첫 번째 코드의 의문2. 서브쿼리를 뺌

특징 case 문(9개의 when) 사용

의문 when 이 너무 많고, 작성한 when에 벗어나는 price가 더 추가되는 경우에 대처를 할 수 없다 

SELECT  case
            when(price< 10000) then 0
            when(PRICE>=10000 and price <20000) then 10000
            when(PRICE>=20000 and price <30000) then 20000
            when(PRICE>=30000 and price <40000) then 30000
            when(PRICE>=40000 and price <50000) then 40000
            when(PRICE>=50000 and price <60000) then 50000
            when(PRICE>=60000 and price <70000) then 60000
            when(PRICE>=70000 and price <80000) then 70000
            when(PRICE>=80000 and price <90000) then 80000
        end AS PRICE_GROUP,
        count(*) as PRODUCTS
FROM product
group by 1
order by 1

 

세 번째 코드

코드 설명 div(몫) 연산자를 사용하여 case when 을 줄이고, 다양한 price 값에 대처가 가능한 쿼리문을 씀

참고자료 [링크]

의문 나누고 다시 곱하는 것이 비효율적이다

SELECT  (PRICE div 10000)*10000 AS PRICE_GROUP,
        count(*) as PRODUCTS
FROM product
group by 1
order by 1

 

네 번째 코드 / 최종

코드 설명 버림 함수truncate(컬럼명, 버릴 자릿수)를 사용하여 연산횟수를 2(곱, 나)→1(버림)로 줄였다

SELECT  TRUNCATE(price, -4) AS PRICE_GROUP,
        count(*) as PRODUCTS
FROM product
group by 1
order by 1

 


느낀 점 계속 기억해야할 것 / 다시 저번 팀플젝 리마인드

- 팀플젝은 시간계획, 역할분담 모두 세부적으로 잘 세워야 제한시간 내에 개발이 가능하고 회색지대를 최소화할 수 있는 것 같다.

 (회색지대: 구현은 해야하는데 맡은 사람이 없는 경우)

- 깃 커밋 컨벤션 계속 사용하기

- Pull Request와 Issue창 적극 활용하기

- 트러블 슈팅 문서화 → 담당자가 필요하나

- README.md 작성하기 → 담당자가 필요하나(2)

 → 그러려면, 매 작업을 문서화 해야 함

- 깃 허브에 올라가는 코드 중 숨기고 싶은 코드구간은 어떻게 숨겨야 할까 ( gitignore 처럼 파일통째로 숨기는 것 말고)

- Git 브랜칭 전략 사용하여 개발 브랜치와 기능 브랜치 활용하기

https://youtu.be/wtsr5keXUyE?si=jFsteROePfqsIF7a

 

 

반응형

블로그의 정보

노력하는 실버티어

노실언니

활동하기