문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
재정의
문제를 풀기 위해서는, 만원 단위의 금액의 테이블을 만들어야 한다.
스크립트 언어 였으면, 몫 나누기 연산으로 바로 해결 할 수 있을 것이다.
실제로, DIV와 MOD를 이용하여 MySQL에서 해당 연산을 할 수 있다.
DIV 사용
SELECT
(PRICE DIV 10000)*10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP
몫 을 구하고, 다시 자릿수를 복원시켜주는 방식으로 치환.
TRUNCATE 자릿수 버림
SELECT
TRUNCATE(PRICE, -4) AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP
버림 함수를 사용할 수 있다.
MySQL은 TRUNCATE(버림), ROUND(반올림) 함수에 자릿수를 음수로 넣어줄 수 있다.
변수 활용하기
시간대 구하기 문제 처럼,
없는 금액대에도 0으로 카운트를 해 주고 싶다면 어떻게 해야할까?
없는 금액을 생성하려면, 반복문이 필요하다.
그리고 MySQL에서는 반복문이 가능하다.
해당 문제에서는 필요없기 때문에 쿼리를 한번 더 넣어서 0인 것들을 잘라냈다.
SET @PRICE_GROUP = -10000;
WITH tmp AS
(
SELECT
(@PRICE_GROUP := @PRICE_GROUP + 10000) AS PRICE_GROUP,
(
SELECT COUNT(*)
FROM PRODUCT
WHERE
PRICE >= @PRICE_GROUP
AND PRICE <(@PRICE_GROUP + 10000)
) AS PRODUCTS
FROM
PRODUCT
WHERE
@PRICE_GROUP <= (
SELECT MAX(PRICE)
FROM PRODUCT
)
)
SELECT
*
FROM
tmp
WHERE
PRODUCTS != 0
피드백
TRUNCATE의 자릿수를 다루는데 조심할 것.
SET은 무조건 제일 처음에 정의 해야 한다.
WITH은 한번만 호출하고, AS를 연속적으로 생성할 수 있음에 유의할 것.
'프로그래밍 언어 > MySQL' 카테고리의 다른 글
비트 연산 활용하기 (0) | 2024.02.22 |
---|---|
Where In 활용하기 (0) | 2024.02.14 |
서브 테이블로 복잡한 쿼리 풀기 (0) | 2024.02.11 |
서브 쿼리로 데이터 끼워 넣기 (0) | 2024.02.11 |
SQL 코딩 테스트 훈련 (0) | 2024.02.08 |
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
재정의
문제를 풀기 위해서는, 만원 단위의 금액의 테이블을 만들어야 한다.
스크립트 언어 였으면, 몫 나누기 연산으로 바로 해결 할 수 있을 것이다.
실제로, DIV와 MOD를 이용하여 MySQL에서 해당 연산을 할 수 있다.
DIV 사용
SELECT
(PRICE DIV 10000)*10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP
몫 을 구하고, 다시 자릿수를 복원시켜주는 방식으로 치환.
TRUNCATE 자릿수 버림
SELECT
TRUNCATE(PRICE, -4) AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP
버림 함수를 사용할 수 있다.
MySQL은 TRUNCATE(버림), ROUND(반올림) 함수에 자릿수를 음수로 넣어줄 수 있다.
변수 활용하기
시간대 구하기 문제 처럼,
없는 금액대에도 0으로 카운트를 해 주고 싶다면 어떻게 해야할까?
없는 금액을 생성하려면, 반복문이 필요하다.
그리고 MySQL에서는 반복문이 가능하다.
해당 문제에서는 필요없기 때문에 쿼리를 한번 더 넣어서 0인 것들을 잘라냈다.
SET @PRICE_GROUP = -10000;
WITH tmp AS
(
SELECT
(@PRICE_GROUP := @PRICE_GROUP + 10000) AS PRICE_GROUP,
(
SELECT COUNT(*)
FROM PRODUCT
WHERE
PRICE >= @PRICE_GROUP
AND PRICE <(@PRICE_GROUP + 10000)
) AS PRODUCTS
FROM
PRODUCT
WHERE
@PRICE_GROUP <= (
SELECT MAX(PRICE)
FROM PRODUCT
)
)
SELECT
*
FROM
tmp
WHERE
PRODUCTS != 0
피드백
TRUNCATE의 자릿수를 다루는데 조심할 것.
SET은 무조건 제일 처음에 정의 해야 한다.
WITH은 한번만 호출하고, AS를 연속적으로 생성할 수 있음에 유의할 것.
'프로그래밍 언어 > MySQL' 카테고리의 다른 글
비트 연산 활용하기 (0) | 2024.02.22 |
---|---|
Where In 활용하기 (0) | 2024.02.14 |
서브 테이블로 복잡한 쿼리 풀기 (0) | 2024.02.11 |
서브 쿼리로 데이터 끼워 넣기 (0) | 2024.02.11 |
SQL 코딩 테스트 훈련 (0) | 2024.02.08 |