[프로그래머스]Oracle SQL_2(Lv2)

2025. 9. 16. 23:15·코딩 테스트/02. SQL

<<오라클 문법 기록장>>

🔸1. 가격대 별 상품 개수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131530?language=oracle

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

POINT!

TRUNC 함수나 FLOOR함수를 사용하면 특정 단위로 숫자를 내림 처리할 수 있다.

TRUNC와 FLOOR의 가장 큰 차이점은 버림할 위치를 정해서 버림할 수 있는지 여부이다

 

  • TRUNCATE: 위치를 지정해서 버릴 수 있는 유연성을 가짐.
  • FLOOR: 항상 정수 단위로 버리며, 다른 단위로 버리려면 수학 연산이 필요.

TRUNC vs FLOOR 비교표

구분 TRUNC (TRUNCATE) FLOOR
기본 기능 지정된 위치에서 숫자를 자름. 주어진 숫자보다 작거나 같은 가장 큰 정수를 반환.
주요 차이 소수점 자릿수(양수, 0, 음수)를 지정하여 버릴 위치를 유연하게 제어. 항상 소수점 아래를 버려 정수 형태로 만듦.
사용 예시 TRUNC(12345.678, -2) → 12300<br>(백의 자리에서 자름) FLOOR(12345.678) → 12345<br>(소수점 아래를 버림)
특정 단위 내림 TRUNC(PRICE, -4)<br>(만원 단위로 내림) FLOOR(PRICE / 10000) * 10000<br>(만원 단위로 내림)

 

🔸2. 자동차 평균 대여 기간 구하기

SELECT 
    CAR_ID, 
    TO_CHAR(ROUND(AVG(END_DATE - START_DATE + 1), 1), 'FM9990.0') AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(END_DATE - START_DATE + 1) >= 7
ORDER BY ROUND(AVG(END_DATE - START_DATE + 1), 1) DESC, CAR_ID DESC;

POINT!  왜 TO_CHAR가 필요했는가?

Oracle에서 숫자를 출력할 때는 데이터의 실제 저장값과 출력 형태가 완전히 별개이다!

즉, 숫자 컬럼을 그대로 SELECT 하면 DB가 알아서 보여주지만, 이때 자동으로 포맷을 맞춰주지는 않는다.

예를 들어 실제값이 7.0일 경우 출력값은 7일수도 있고 7.0일 수도 있다

따라서!

이 문제를 해결하기 위해서 출력할 때 TO_CHAR를 이용해서 원하는 형식으로 강제 변환을 해야한다.

정수와 소수가 섞인 결과를 항상 x.0 형태로 출력하려면 TO_CHAR 사용 필수.

TO_CHAR(7, 'FM9990.0')

 

  • FM → 숫자 앞뒤의 공백 제거 (Fixed Mode)
  • 9990.0 → 
    • 9990 → 정수 자리는 최소 1자리 이상
    • .0 → 소수점 첫째 자리 항상 출력
  • 9와 0의 의미
기호 의미 특징
9 숫자가 있을 때만 표시 값이 없으면 공백으로 처리
0 숫자가 없으면 0으로 표시 항상 그 자리를 채움

 

 

예시)

  • 9999 -> 숫자가 없으면 빈 칸 -> 공백이 출력됨
  • 0000 -> 빈자리는 0으로 채운다 -> 0000이 출력됨

🔸3. 나머지 문제

1. 조건에 맞는 도서와 저자 리스트 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/144854?language=oracle

SELECT 
    B.BOOK_ID,
    A.AUTHOR_NAME,
    TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B
    JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE B.CATEGORY = '경제'
ORDER BY PUBLISHED_DATE;

 

2. 성분으로 구분한 아이스크림 총 주문량

https://school.programmers.co.kr/learn/courses/30/lessons/133026?language=oracle

SELECT 
    INFO.INGREDIENT_TYPE,
    SUM(FH.TOTAL_ORDER) AS "TOTAL_ORDER"
FROM FIRST_HALF FH
    JOIN ICECREAM_INFO INFO ON FH.FLAVOR = INFO.FLAVOR
GROUP BY INFO.INGREDIENT_TYPE

 

3. 상품별 오프라인 매출 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131533?language=oracle

SELECT 
    P.PRODUCT_CODE,
    SUM(P.PRICE * SALES.SALES_AMOUNT) AS "SALES"
FROM OFFLINE_SALE SALES
    JOIN PRODUCT P ON SALES.PRODUCT_ID = P.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, P.PRODUCT_CODE ASC;

 

4. 3월에 태어난 여성 회원 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131120?language=oracle

SELECT
    MEMBER_ID,
    MEMBER_NAME,
    GENDER,
    TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') AS "DATE_OF_BIRTH" 
FROM MEMBER_PROFILE 
WHERE TLNO IS NOT NULL
    AND EXTRACT(MONTH FROM DATE_OF_BIRTH) = 03 
    AND GENDER  ='W'
ORDER BY MEMBER_ID ASC;

5. 루시와 엘라 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/59046?language=oracle

SELECT
    ANIMAL_ID,
    NAME,
    SEX_UPON_INTAKE
FROM ANIMAL_INS 
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID;

6. 조건에 부합하는 중고거래 상태 조회하기

SELECT 
    BOARD_ID,
    WRITER_ID,
    TITLE,
    PRICE,
    CASE
        WHEN STATUS = 'SALE' THEN '판매중'
        WHEN STATUS = 'RESERVED' THEN '예약중'
    ELSE '거래완료' 
    END AS "STATUS" 
FROM USED_GOODS_BOARD 
WHERE TO_CHAR(CREATED_DATE, 'YYYY-MM-DD') = '2022-10-05'
ORDER BY BOARD_ID DESC;

7. 재구매가 일어난 상품과 회원리스트 구하기

SELECT 
    USER_ID,
    PRODUCT_ID
FROM ONLINE_SALE 
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC;

 

'코딩 테스트 > 02. SQL' 카테고리의 다른 글

[프로그래머스]Oracle SQL_2(Lv3)  (0) 2025.09.20
[프로그래머스] Oracle SQL_1(Lv3)  (0) 2025.09.19
[프로그래머스]Oracle SQL_1(Lv2)  (0) 2025.09.13
[프로그래머스]Oracle SQL(Lv2,10문제)  (0) 2025.09.12
[프로그래머스] Oracle SQL (Lv1, 24문제)  (1) 2025.09.11
'코딩 테스트/02. SQL' 카테고리의 다른 글
  • [프로그래머스]Oracle SQL_2(Lv3)
  • [프로그래머스] Oracle SQL_1(Lv3)
  • [프로그래머스]Oracle SQL_1(Lv2)
  • [프로그래머스]Oracle SQL(Lv2,10문제)
Growth DA Log
Growth DA Log
Growth DA Log 님의 블로그 입니다.
  • Growth DA Log
    Growth DA Log님의 블로그
    Growth DA Log
  • 전체
    오늘
    어제
    • 분류 전체보기 (125)
      • TIS_COMPANY (6)
      • 코딩 테스트 (61)
        • 01. Python (3)
        • 02. SQL (58)
      • 데이터 분석 (53)
        • 01. BigQuery (9)
        • 02. GA4 (1)
        • 02-1. GA4를 더 잘 다루기 위한 마케팅 개.. (5)
        • 03. streamlit (5)
        • 04. Git (12)
        • 05. 데이터 엔지니어링 (3)
        • 06. 데이터 모델링 (11)
        • 07. Excel (0)
        • 08. Tableau (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    tableaubootcamp
    코드잇스프린트후기
    DENSE_RANK
    rank
    tableau
    윈도우함수
    revert
    코테
    AARRR
    이행성
    코딩테스트
    SQL
    streamlit
    solvesql
    git
    cross_join
    ROW_NUMBER
    Reset
    쿼리테스트
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Growth DA Log
[프로그래머스]Oracle SQL_2(Lv2)
상단으로

티스토리툴바