SQL 알고리즘 풀이 - 3/24

송현진·2023년 3월 24일

SQL

목록 보기
5/17

루시와 엘라 찾기

  • 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')

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

  • APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회. 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE MONTH(APNT_YMD) = '05'
GROUP BY MCDP_CD
ORDER BY COUNT(*), MCDP_CD

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

  • PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력. 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬
SELECT P.PRODUCT_CODE, SUM(P.PRICE * O.SALES_AMOUNT) AS SALES
FROM PRODUCT P INNER JOIN OFFLINE_SALE O 
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE

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

  • MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회. 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH)=3 AND TLNO IS NOT NULL AND GENDER ='W'
ORDER BY MEMBER_ID

자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

  • AR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력. 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬
SELECT CAR_TYPE, COUNT(*) AS CARS FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE

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

  • '경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력. 출판일을 기준으로 오름차순 정렬
SELECT B.BOOK_ID, A.AUTHOR_NAME, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE FROM BOOK B
INNER JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE

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

  • 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회. 총주문량을 나타내는 컬럼명은 TOTAL_ORDER
SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS TOTAL_ORDER FROM ICECREAM_INFO I
INNER JOIN FIRST_HALF F ON I.FLAVOR = F.FLAVOR
GROUP BY I.INGREDIENT_TYPE
ORDER BY F.TOTAL_ORDER

가격대 별 상품 개수 구하기

  • PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력. 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬
SELECT (CASE WHEN (0 < PRICE) AND (PRICE < 10000) then 0
             WHEN (10000 <= PRICE) and (PRICE < 20000) then 10000
             WHEN (20000 <= PRICE) and (PRICE < 30000) then 20000
             WHEN (30000 <= PRICE) and (PRICE < 40000) then 30000
             WHEN (40000 <= PRICE) and (PRICE < 50000) then 40000
             WHEN (50000 <= PRICE) and (PRICE < 60000) then 50000
             WHEN (60000 <= PRICE) and (PRICE < 70000) then 60000
             WHEN (70000 <= PRICE) and (PRICE < 80000) then 70000
             ELSE 80000 END
       ) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY  PRICE_GROUP
ORDER BY PRICE_GROUP

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

  • ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력. 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬
SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC

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

  • USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회. 래상태가 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 DATE_FORMAT(CREATED_DATE, '%Y-%m-%d') = '2022-10-05'
ORDER BY BOARD_ID DESC

자동차 평균 대여 기간 구하기

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

오랜 기간 보호한 동물(1)

  • 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회. 보호 시작일 순으로 조회
SELECT i.name, i.datetime from animal_ins i
left join animal_outs o on i.ANIMAL_ID = o.ANIMAL_ID
where o.animal_id is null
order by i.datetime
limit 3

있었는데요 없었습니다

  • 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회. 보호 시작일이 빠른 순으로 조회
SELECT i.ANIMAL_ID, i.name from animal_ins i
inner join animal_outs o on i.animal_id = o.animal_id
where i.datetime > o.datetime
order by i.datetime

오랜 기간 보호한 동물(2)

  • 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회. 보호 기간이 긴 순
SELECT i.animal_id, i.name from ANIMAL_INS i
left join ANIMAL_OUTS o on i.ANIMAL_ID = o.ANIMAL_ID
where o.datetime - i.datetime
order by o.datetime - i.datetime desc
limit 2

조건별로 분류하여 주문상태 출력하기

  • FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬
SELECT ORDER_ID, PRODUCT_ID, date_format(OUT_DATE, '%Y-%m-%d') as OUT_DATE ,
(case when out_date < '2022-05-01' then '출고완료'
      when out_date = '2022-05-01' then '출고완료'
      when out_date > '2022-05-01' then '출고대기'
      else '출고미정' end) as 출고여부
from FOOD_ORDER 
order by ORDER_ID;

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

  • 2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력. 카테고리명을 기준으로 오름차순 정렬
SELECT b1.CATEGORY, sum(b2.SALES) as TOTAL_SALES from book b1
inner join book_sales b2 on b1.book_id = b2.book_id
where substring(b2.SALES_DATE, 1, 7) = '2022-01'
group by b1.CATEGORY
order by b1.CATEGORY

없어진 기록 찾기

  • 천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL

즐겨찾기가 가장 많은 식당 정보 출력하기

  • REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회. 음식 종류를 기준으로 내림차순 정렬
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM REST_INFO
WHERE (FOOD_TYPE,FAVORITES) IN (
                    SELECT FOOD_TYPE, MAX(FAVORITES)
                    FROM REST_INFO
                    GROUP BY FOOD_TYPE
                   )
ORDER BY FOOD_TYPE DESC

조건에 맞는 사용자와 총 거래금액 조회하기

  • USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회. 총거래금액을 기준으로 오름차순 정렬
SELECT U.USER_ID, U.NICKNAME, SUM(B.PRICE) AS TOTAL_SALES FROM USED_GOODS_USER U
INNER JOIN USED_GOODS_BOARD B ON U.USER_ID = B.WRITER_ID
WHERE STATUS = 'DONE'
GROUP BY  U.USER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES

대여 기록이 존재하는 자동차 리스트 구하기

  • CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬
SELECT DISTINCT(C.CAR_ID) AS CAR_ID FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE = '세단' AND DATE_FORMAT(START_DATE, '%m') = '10'
ORDER BY C.CAR_ID DESC

조건에 맞는 사용자 정보 조회하기

  • USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회. 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬
SELECT U.USER_ID, U.NICKNAME,
       CONCAT(U.CITY," ", U.STREET_ADDRESS1," ",U.STREET_ADDRESS2) AS 전체주소,
       CONCAT(LEFT(TLNO,3),"-",MID(TLNO,4,4),"-",RIGHT(TLNO,4)) AS 전화번호
FROM USED_GOODS_USER U
INNER JOIN (
            SELECT WRITER_ID
            FROM USED_GOODS_BOARD
            GROUP BY WRITER_ID
            HAVING COUNT(*) >= 3
           ) B ON U.USER_ID = B.WRITER_ID
ORDER BY U.USER_ID DESC

✏️ 컬럼들을 이어붙여서 만들 때 concat이라는 문법을 쓸 수 있다. left(), right(), mid() 함수는 엑셀과 똑같아서 이용하기 편했다. 그래서 형식을 만들어 줄 때도 여러가지 문법들로 여러가지 형태로 만들 수 있다.

profile
개발자가 되고 싶은 취준생

0개의 댓글