Programmers SQL 문제 풀기 | LEFT, SUBSTR, RIGHT

나나·2025년 5월 8일
0

GROUP BY: 진료과별 총 예약 횟수 출력하기

⭐⭐

문제

APPOINTMENT 테이블에서

  • 2022년 5월에 예약한
  • 환자 수를
  • 진료과코드 별로 조회하는 SQL문을 작성해주세요.
  • 이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고
  • 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.

코드

-- 코드를 입력하세요
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS '5월예약건수'
FROM APPOINTMENT 
WHERE APNT_YMD BETWEEN '2022-05-01' AND '2022-05-31'
GROUP BY MCDP_CD
ORDER BY COUNT(*), MCDP_CD;

설명

WHERE절에서 5월에 예약한 환자를 필터링합니다.
SELECT절에서는 문제에서 주어진 열 이름 조건에 맞게 작성합니다.
진료과코드별로 조회하는 것이므로 GROUP BY절을 사용합니다.
ORDER BY절에서는 설정한 열 이름이 아닌 원래 열 이름 또는 함수 식을 사용하여 구성해야 합니다. 저는 이 부분을 몰라서 처음에 ORDER BY '5월예약건수', '진료과코드'라고 기입해서 틀렸었습니다.

GROUP BY: 성분으로 구분한 아이스크림 총 주문량

⭐⭐

문제

  • 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을
  • 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요.
  • 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.

코드

-- 코드를 입력하세요
SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS 'TOTAL_ORDER'
FROM FIRST_HALF F JOIN ICECREAM_INFO I ON F.FLAVOR = I.FLAVOR
GROUP BY I.INGREDIENT_TYPE
ORDER BY SUM(F.TOTAL_ORDER)

설명

성분 타입별 총 주문량이 궁금한 것이기 때문에 GROUP BY절에서 INGREDIENT_TYPE로 그룹화합니다.

GROUP BY: 카테고리 별 도서 판매량 집계하기

⭐⭐⭐

문제

  • 2022년 1월의
  • 카테고리 별
  • 도서 판매량을 합산하고,
  • 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요.
  • 결과는 카테고리명을 기준으로 오름차순 정렬해주세요.

코드

-- 코드를 입력하세요
SELECT B.CATEGORY, SUM(S.SALES) AS 'TOTAL_SALES'
FROM BOOK_SALES S JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
WHERE S.SALES_DATE BETWEEN '2022-01-01' AND '2022-01-31'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY;

설명

WHERE절에서 1월에 판매된 도서를 필터링합니다.
GROUP BY절에서 카테고리별로 그룹화합니다.
또한 SUM함수를 활용해 총 판매량을 구하고 ORDER BY절에서 카테고리를 기준으로 정렬합니다.

STRING, DATE: 조건에 맞는 사용자 정보 조회하기

⭐⭐⭐

문제

USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서

  • 중고 거래 게시물을 3건 이상 등록한 사용자의
  • 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요.
  • 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고,
  • 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요.
  • 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

코드

-- 코드를 입력하세요
WITH USERID AS (
    SELECT WRITER_ID
    FROM USED_GOODS_BOARD 
    GROUP BY WRITER_ID
    HAVING COUNT(*)>=3
)

SELECT USER_ID, NICKNAME,
    CONCAT(CITY, ' ', STREET_ADDRESS1, ' ', STREET_ADDRESS2) AS '전체주소',
    CONCAT(LEFT(TLNO,3), '-', SUBSTR(TLNO,4,4), '-', RIGHT(TLNO,4)) as '전화번호'
FROM USED_GOODS_USER 
WHERE USER_ID IN (SELECT * FROM USERID)
ORDER BY USER_ID DESC;

설명

WITH절에서 게시물을 3건 이상 등록한 사용자 ID를 추출합니다.
CONCAT 함수를 사용하여 전체주소와 전화번호를 문제 조건에 맞게 작성합니다.
먼저, 전체주소는 시, 도로명 주소, 상세 주소를 띄어쓰기 단위로 합쳐줍니다.
다음으로 전화번호는 'xxx-xxxx-xxxx'형식이므로 3글자 뒤에 '-' 삽입, 4번째 글자부터 4글자 뒤에 '-' 삽입, 마지막 4글자 출력이므로 LEFT, SUBSTR, RIGHT함수를 사용하여 구성합니다.
저는 전화번호에서 막혀서 답안을 참고하여 쿼리를 구성하였답니다..!

STRING, DATE: 조건에 부합하는 중고거래 상태 조회하기

⭐⭐

문제

USED_GOODS_BOARD 테이블에서

  • 2022년 10월 5일에 등록된
  • 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요.
  • 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고,
  • 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

코드

-- 코드를 입력하세요
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 CREATED_DATE = '2022-10-05'
ORDER BY BOARD_ID DESC;

설명

WHERE절에서 10월 5일에 작성된 게시물을 필터링합니다.
또한 CASE문을 사용하여 조건에 맞게 STATUS가 출력되도록 합니다.

profile
데이터에서 의사결정으로

0개의 댓글