[241004] SQL 스터디

JunichiK·2024년 10월 4일

SQL 스터디

목록 보기
11/21

문제 & 제출 답안

오답노트

  • 범위 설정 오류
    • 정답
      SELECT
         case when price < 10000 then 0
              when price < 20000 then 10000
              when price < 30000 then 20000
              when price < 40000 then 30000
              when price < 50000 then 40000
              when price < 60000 then 50000
              when price < 70000 then 60000
              when price < 80000 then 70000
              when price < 90000 then 80000
              end as price_group,
              COUNT(PRODUCT_ID) AS PRODUCTS
      from product
      GROUP BY 1
      ORDER BY 1 ASC
    • 내가 쓴 답
      SELECT
         case when price < 10000 then 0
              when price between 10000 and 20000 then 10000
              when price between 20000 and 30000 then 20000
              when price between 30000 and 40000 then 30000
              when price between 40000 and 50000 then 40000
              when price between 50000 and 60000 then 50000
              when price between 60000 and 70000 then 60000
              when price between 70000 and 80000 then 70000
              when price between 80000 and 90000 then 80000
              end as price_group,
              COUNT(PRODUCT_ID) AS PRODUCTS
      from product
      GROUP BY 1
      ORDER BY 1 ASC
      • 오답 이유
        • 일단 일일이 between 쓰기에 비효율적임
        • 예를 들어 2만의 경우 2만이 아닌 1만으로 표기됨
    • 더 효율적인 접근 방법들
      • DIV 함수
        SELECT 10000 * (PRICE DIV 10000) AS PRICE_GROUP, COUNT(1) AS PRODUCTS
        FROM PRODUCT
        GROUP BY PRICE_GROUP
        ORDER BY PRICE_GROUP
        • A DIV B : A / B 값의 몫 출력
        • 산출 방식 10000 (52000 DIV 10000) → 10000 (52000 / 10000) → 10000 5.2 → 10000 5
      • Truncate 함수
        SELECT A.PRICE_GROUP, COUNT(A.PRODUCT_ID) AS PRODUCTS
        FROM(
        SELECT *, TRUNCATE(PRICE, -4) AS PRICE_GROUP
        FROM PRODUCT
        ) A
        GROUP BY 1
        ORDER BY 1 ASC
        • Truncate(값, 버릴 자리수) : 값에서 특정 자리수 이하를 버림
        • 산출 방식 : 52000 → 50000
      • Floor 함수
        SELECT FLOOR(PRICE / 10000)*10000 AS PRICE_GROUP, COUNT(*) AS PRODUCTS
            FROM PRODUCT
            GROUP BY 1
            ORDER BY 1
        • Floor(값) : 값의 정수 부분만 남기는 함수 (소수점 첫째자리에서 버림)
        • 산출 방식 : 52000 / 10000 = 5.2 → 5 → 50000
  • where절 서브쿼리
    • 정답
      select food_type, rest_id, rest_name, favorites
      from rest_info
      where favorites in
          (select max(favorites)
           from rest_info
           group by food_type
          )
      group by 1
      order by 1 desc
    • 내가 쓴 답
      select *, max(favorites)
      from
      (select food_type, rest_id, rest_name, sum(favorites)
      from rest_info
      group by 2
      ) a
      group by food_type
      order by food_type desc
      • 오답 이유
        • where 절에서 서브쿼리 사용할 생각을 못함
        • 결과적으로 가장 많은 즐겨찾기를 이용한 레스토랑과 연결 짓지 못함
        • 조건 상으로 쿼리문이 필요하면 where 뒤에 서브쿼리 활용
  • concat 함수
profile
represent ojeong-dong

0개의 댓글