728x90
프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지
문제 설명
다음은 어느 의류 쇼핑몰에서 판매 중인 상품들의 정보를 담은 PRODUCT 테이블입니다. PRODUCT 테이블은 아래와 같은 구조로 되어있으며, PRODUCT_ID, PRODUCT_CODE, PRICE는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.
Column name | Type | Nullable |
PRODUCT_ID | INTEGER | FALSE |
PRODUCT_CODE | VARCHAR(8) | FALSE |
PRICE | INTEGER | FALSE |
상품 별로 중복되지 않는 8자리 상품코드 값을 가지며 앞 2자리는 카테고리 코드를 나타냅니다.
문제
PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.
예시
예를 들어 PRODUCT 테이블이 다음과 같다면
PRODUCT_ID | PRODUCT_CODE | PRICE |
1 | A1000011 | 10000 |
2 | A1000045 | 9000 |
3 | C3000002 | 22000 |
4 | C3000006 | 15000 |
5 | C3000010 | 30000 |
6 | K1000023 | 17000 |
만원 단위의 가격대 별로 상품을 나누면
- 가격대가 0원 ~ 1만 원 미만인 상품은 PRODUCT_ID 가 2인 상품 1개,
- 가격대가 1만원 이상 ~ 2만 원 미만인 상품들은 PRODUCT_ID 가 1, 4, 6인 상품 3개,
- 가격대가 2만원 이상 ~ 3만 원 미만인 상품은 PRODUCT_ID 가 3인 상품 1개,
- 가격대가 3만원 이상 ~ 4만 원 미만인 상품은 PRODUCT_ID 가 5인 상품 1개,
에 각각 해당하므로 다음과 같이 결과가 나와야 합니다.
PRICE_GROUP | PRODUCTS |
0 | 1 |
10000 | 3 |
20000 | 1 |
30000 | 1 |
1. 오라클 정답
select ( case when price < 10000 then 0
else trunc(price, -4) end ) as price_group,
count(*) as products
from product
group by ( case when price < 10000 then 0
else trunc(price, -4) end )
order by price_group;
오라클 해설해보기
# 1. SELECT 절
각 구간 대 별로 CASE 문을 작성할 수는 있지만,
그렇게 되면 쿼리문이 너무 길어지기 때문에
CASE WHEN과 함께 TRUNC를 사용해야한다.
별칭은 문제에서 제시해 준 price_group으로 지정한다.
가격대 별 상품의 개수를 구하기 위해서 count(*) 함수로 수를 구해준다.
별칭은 문제에서 제시해준 products로 지정해준다.
-- 1) CASE 조건 문 : 각 상품 가격 별 구간 정하기)
▶ 문법
CASE WHEN [조건] THEN [조건이 참일 때 출력할 값]
ELSE [조건이 거짓일 때 출력할 값] END
----------------------------------------
-- 2) TRUNC() 함수 : PRICE 데이터를 특정 구간으로 설정하기
▶ 문법
TRUNC( [ 컬럼명 ] , [ 버릴 자릿수 ] )
TRUNC 함수를 사용해서 각 구간에 해당하는 데이터를
특정 값으로 전처리 해준다.
특정 값은 각 구간대 별 최소 금액으로 설정해준다.
TRUNC 함수를 사용할 때 버릴 자릿수에 음수를 넣을 경우
-1 은 1의 자릿수를 버리고 0으로 나타낸다.
( ex. 15,345 → 15,340 )
따라서 - 4를 이용해 천의 자릿수까지 버리고 0으로 나타낸다.
( ex. 15,345 → 10,000)
# 2. FROM 절
데이터를 가져올 테이블명을 입력해준다.
# 3. GROUP BY 절
가격대 별 상품 개수를 구하는 것이기 때문에
가격대별로 데이터를 묶어줘야 한다.
따라서 group by 절에
가격대(price_group)를 넣어줘야 하는데,
별칭은 사용할 수 없기 때문에
case 조건문을 그대로 입력해 준다.
별칭을 사용할 수 없는 이유는
아래에 첨부한 게시글을 통해 확인할 수 있다.
# 4. ORDER BY 절
price_group을 기준으로 오름차순(asc)으로 정렬해준다.
2. MySQL 정답
select ( case when price < 10000 then 0
else truncate(price, -4) end ) as price_group,
count(*) as products
from product
group by price_group
order by price_group;
MySQL 해설해 보기
# 1. SELECT 절
각 구간 대 별로 CASE 문을 작성할 수는 있지만,
그렇게 되면 쿼리문이 너무 길어지기 때문에
CASE WHEN과 함께 TRUNC를 사용해야 한다.
별칭은 문제에서 제시해 준 price_group으로 지정한다.
가격대 별 상품의 개수를 구하기 위해서 count(*) 함수로 수를 구해준다.
별칭은 문제에서 제시해준 products로 지정해준다.
-- 1) CASE 조건 문 : 각 상품 가격 별 구간 정하기)
▶ 문법
CASE WHEN [조건] THEN [조건이 참일 때 출력할 값]
ELSE [조건이 거짓일 때 출력할 값] END
----------------------------------------
-- 2) TRUNC() 함수 : PRICE 데이터를 특정 구간으로 설정하기
▶ 문법
TRUNC( [ 컬럼명 ] , [ 버릴 자릿수 ] )
TRUNC 함수를 사용해서 각 구간에 해당하는 데이터를
특정 값으로 전처리 해준다.
특정 값은 각 구간대 별 최소 금액으로 설정해준다.
TRUNC 함수를 사용할 때 버릴 자릿수에 음수를 넣을 경우
-1 은 1의 자릿수를 버리고 0으로 나타낸다.
( ex. 15,345 → 15,340 )
따라서 - 4를 이용해 천의 자릿수까지 버리고 0으로 나타낸다.
( ex. 15,345 → 10,000)
# 2. FROM 절
데이터를 가져올 테이블명을 입력해준다.
# 3. GROUP BY 절
가격대 별 상품 개수를 구하는 것이기 때문에
가격대별로 데이터를 묶어줘야 한다.
따라서 group by 절에
가격대(price_group)를 입력해준다.
(오라클과 다르게 group by절에 별칭 사용 가능)
# 4. ORDER BY 절
price_group을 기준으로 오름차순(asc)으로 정렬해준다.
결과 출력
출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
반응형
'SQL 문제 풀기 > 1. 프로그래머스 SQL : 2023.12.17~2024.2.29' 카테고리의 다른 글
<프로그래머스 46> 조건에 부합하는 중고거래 상태 조회하기(Lv.2) (0) | 2024.01.31 |
---|---|
<프로그래머스 45> 재구매가 일어난 상품과 회원 리스트 구하기(Lv.2) (2) | 2024.01.30 |
<프로그래머스 43> 3월에 태어난 여성 회원 목록 출력하기(Lv.2) (4) | 2024.01.28 |
<프로그래머스 42> 루시와 엘라 찾기(Lv.2) (0) | 2024.01.27 |
<프로그래머스 41> 성분으로 구분한 아이스크림 총 주문량(Lv.2) (0) | 2024.01.26 |