TIL_[SQL] 프로그래머스_코딩테스트 회고를 통한 sql 문법 공부3

김희정·2023년 12월 8일

TIL

목록 보기
9/57
post-thumbnail

조건에 맞는 사용자와 총 거래 금액 조회하기

Q. USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 
70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 
결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
(내가 쓴 답 = 오답)
SELECT b.user_id, b.nickname, sum(a.price) "TOTAL_SALES"
from used_goods_board a inner join used_goods_user b
on a.writer_id=b.user_id
where a.status = 'DONE' and sum(a.price) >= 700000
group by b.user_id
order by 3

이렇게 작성했는데 오류가 뜬다.

찾아보니 <집계함수는 where 절에 쓸 수 없다> 는 사실을 알았다‼️

  • 집계함수(AVG, SUM, COUNT 등등)은 group by와 묶어서 씀
  • where 대신 having 에서 집계함수 쓸 것
(정답)
SELECT b.user_id, b.nickname, sum(a.price) "TOTAL_SALES"
from used_goods_board a inner join used_goods_user b
on a.writer_id=b.user_id
where a.status = 'DONE' 
group by b.user_id
having sum(a.price) >= 700000
order by 3

가격대 별 상품 개수 구하기

Q. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 
이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 
각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 
결과는 가격대를 기준으로 오름차순 정렬해주세요.
(내가 쓴 답 = 정답)
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 price_group,
         count(*) products
from product
group by 1
order by 1

case when 문으로 노가다를 해서 맞추긴 했으나, 다른 사람들은 어떻게 풀었나 보다가 참신한 방법이 있어서 그분의 풀이를 가져왔다.

SELECT FLOOR(PRICE / 10000) * 10000 AS `PRICE_GROUP`,
		COUNT(*) AS PRODUCTS    
FROM PRODUCT
GROUP BY `PRICE_GROUP`
ORDER BY `PRICE_GROUP`

처음엔 이게 대체 어떻게 해서 만원대로 걸러지는지 이해를 못했는데

ex) price: 16,000
price / 10,000 : 1.6
floor(1.6) = 1
1 * 10,000 = 10,000 

이렇게 하나하나 풀어보니 이제야 의문이 풀렸다.

비슷하게 TRUNCATE를 사용한 풀이도 있었다.

SELECT TRUNCATE(PRICE / 10000, 0) * 10000 AS `PRICE_GROUP`, 
		COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY `PRICE_GROUP`
ORDER BY `PRICE_GROUP`
  • TRUNCATE(number. decimals)
    number를 소수점 아래 decimals 번째까지 잘라내는 역할을 함

즐겨찾기가 가장 많은 식당 정보 출력하기

Q. REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 
음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 
이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

이문제는 내가 유일하게 남이 풀어놓은걸 봐도 이해를 못하겠어서 여기에 박제해둔다.
틈틈히 와서 보고 왜 이렇게 되는지 고민좀 해봐야 할 것 같다 🥲

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;
  • where (A) in (B) :
    B값과 일치하는 A열을 조건으로 함
profile
데이터 애널리스트가 되고 싶은

0개의 댓글