본문 바로가기

SQL 문제풀이

[GROUP BY] 가격대 별 상품 개수 구하기

코딩테스트 연습 - 가격대 별 상품 개수 구하기 | 프로그래머스 스쿨 (programmers.co.kr)


PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

PRODUCT_ID PRODUCT_CODE PRICE
1 A1000011 10000
2 A1000045 9000
3 C3000002 22000
4 C3000006 15000
5 C3000010 30000
6 K1000023 17000
SELECT TRUNCATE(PRICE / 10000,0)*10000 "PRICE_GROUP", COUNT(PRICE) "PRODUCTS"
    FROM PRODUCT
    GROUP BY TRUNCATE(PRICE / 10000,0)*10000
    ORDER BY TRUNCATE(PRICE / 10000,0)*10000 ASC;

TRUNCATE 함수   TRUNCATE(N, n)

-숫자데이터를 지정한 자리(n)아래(->방향)로 절삭(=제거)하여 반환 (n을 기재하지 않을 경우 소수점 이하는 all삭제)

-n값이 음수이면 소수점 왼쪽 n자리에서 절삭한 값 출력

EX) TRUNCATE(-4.32,1)= -4.3 / TRUNCATE(-4.3) = -4 / TRUNCATE(123.17,1)=123.1

-소수점 단위가 긴 값을 줄여서 보여줘야 할 때 사용할 수 있겠다

EX) TRUNCATE(9000 / 10000) = 0.9 에서 소수점 이하 자릿수를 제거하므로 0

TRUNCATE(22000 / 10000,0) = 2.2 에서 소수점 이하 자릿수를 제거하므로 2

논리

0~9900원, 10000원에서 19900원, 20000원에서 29900원 을 각각 0원 10000원 20000원으로 자르는 방법은 

GROUP BY함수엔 별칭을 쓸 수 없으므로 식 그자체로 넣음

SELECT TRUNC(PRICE, -4) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY TRUNC(PRICE, -4)
ORDER BY PRICE_GROUP ASC

TRUNCATE 함수 를 이렇게도 쓸 수 있구나

TRUNCATE 함수 소수점 지정 자리에 -가 들어가면 소수점 왼쪽기준 N 자릿수만 남기도록 함EX) TRUNCATE(254.55, -2) = 200

TRUNC(9000,-4) = 소수점 왼쪽 4번째 자리에서 절삭

SELECT  floor(price / 10000) * 10000 as PRICE_GROUP, count(*) as PRODUCTS
    from PRODUCT
    group by floor(price / 10000) * 10000
    order by 1;

CEIL 함수 

크거나 같은 정수 중 가장 작은 값 출력 

ex)floor(123.17)=124

ex) floor(0.9)=1

ex) floor(-1.15)= -1

Floor 함수 

작거나 같은 정수 중 가장 큰 값 

ex) floor(123.17)=123

ex) floor(0.9)=0

ex) floor(-1.15)= -2


*더 많은 예시 참조 블로그

https://blog.naver.com/gochalifecore/223061055796


범위 지정 후 사이값을 도출해야 될 땐

서브쿼리로 SELECT CASE WHEN ~ 구문을 넣으면 더 복잡해지므로 

가능하면 숫자함수를 응용하여 사용하는 게 더 용이