[SQL Kit] String, Date

Yeojin·2023년 12월 11일
0

programmers

목록 보기
4/5

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

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

1) 중고 거래 게시물을 3건 이상 등록한 사용자 먼저 구하기


SELECT USER_ID
     , NICKNAME
     , CITY || ' ' || STREET_ADDRESS1 || ' ' || STREET_ADDRESS2 AS 전체주소
     , REGEXP_REPLACE(TLNO, '(.{3})(.+)(.{4})', '\1-\2-\3') AS 전화번호
  FROM USED_GOODS_USER
 WHERE USER_ID IN (
                      SELECT WRITER_ID
                        FROM USED_GOODS_BOARD
                       GROUP BY WRITER_ID
                      HAVING COUNT(WRITER_ID) >= 3
                   )
 ORDER BY USER_ID DESC



2. 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

USED_GOODS_BOARDUSED_GOODS_FILE 테이블에서 조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성해주세요. 첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬해주세요. 기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.

1) 조회수가 가장 높은 순서대로 조회


SELECT '/home/grep/src/' || A.BOARD_ID || '/' || A.FILE_ID || A.FILE_NAME || A.FILE_EXT AS FILE_PATH
  FROM USED_GOODS_FILE A
  JOIN (
            SELECT ROW_NUMBER() OVER(ORDER BY VIEWS DESC) AS NUM
                 , BOARD_ID
                 , VIEWS
              FROM USED_GOODS_BOARD
             GROUP BY BOARD_ID, VIEWS
        ) B
    ON A.BOARD_ID = B.BOARD_ID
 WHERE B.NUM = 1      
 ORDER BY FILE_ID DESC



3. 자동차 대여 기록 별 대여 금액 구하기

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요

  • CAR_RENTAL_COMPANY_CAR - 대여중인 자동차 정보
  • CAR_RENTAL_COMPANY_RENTAL_HISTORY - 자동차 대여기록 정보
  • CAR_RENTAL_COMPANY_DISCOUNT_PLAN - 자동차 종류 별 대여 기간 종류 별 할인 정책 정보

1) 대여 기간 별 할인률을 따로 조인해야 하므로 CASE WHEN 활용


-- 할인정책 테이블과 LEFT JOIN을 하여 할인 대상이 아닌 데이터도 모두 출력해야 한다.
   SELECT A.HISTORY_ID
        , A.DAILY_FEE * (1 - NVL(B.DISCOUNT_RATE, 0) / 100) * A.DAYS AS FEE
     FROM (
                SELECT A.CAR_ID
                     , B.HISTORY_ID
                     , A.CAR_TYPE
                     , A.DAILY_FEE
                     , TRUNC(B.END_DATE) - TRUNC(B.START_DATE) +1 AS DAYS
                     , CASE WHEN TRUNC(B.END_DATE) - TRUNC(B.START_DATE) +1 BETWEEN 7 AND 29 THEN '7일 이상'
                            WHEN TRUNC(B.END_DATE) - TRUNC(B.START_DATE) +1 BETWEEN 30 AND 89 THEN '30일 이상'
                            WHEN TRUNC(B.END_DATE) - TRUNC(B.START_DATE) +1 >= 90 THEN '90일 이상'
                             END AS DAYS_TYPE
                  FROM CAR_RENTAL_COMPANY_CAR  A
                  JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY  B
                    ON A.CAR_ID = B.CAR_ID
                 WHERE A.CAR_TYPE = '트럭'
           ) A
     LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN B
       ON A.CAR_TYPE = B.CAR_TYPE
      AND A.DAYS_TYPE = B.DURATION_TYPE
    ORDER BY FEE DESC, HISTORY_ID DESC



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

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.


SELECT CAR_ID
     , AVERAGE_DURATION
  FROM (
          SELECT CAR_ID
               , ROUND(AVG(TRUNC(END_DATE) - TRUNC(START_DATE) +1), 1) AS AVERAGE_DURATION
            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
           GROUP BY CAR_ID
        )
 WHERE AVERAGE_DURATION >= 7
 ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC



5. 취소되지 않은 진료 예약 조회하기

PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.


-- 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약
SELECT A.APNT_NO
     , B.PT_NAME
     , B.PT_NO
     , C.MCDP_CD
     , C.DR_NAME
     , A.APNT_YMD
  FROM APPOINTMENT A
  LEFT JOIN PATIENT B
    ON A.PT_NO = B.PT_NO
  LEFT JOIN DOCTOR C
    ON A.MCDP_CD = C.MCDP_CD
   AND A.MDDR_ID = C.DR_ID
 WHERE A.MCDP_CD = 'CS'
   AND A.APNT_CNCL_YN = 'N'
   AND TO_CHAR(A.APNT_YMD , 'YYYY-MM-DD') = '2022-04-13'
 ORDER BY APNT_YMD

profile
"Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better."

0개의 댓글

관련 채용 정보