본문 바로가기
프로그래머스/SQL

STRING/DATE 유형 모음 [프로그래머스.oracle] (SQL 고득점 키트)

by 몰라닉네임 2023. 10. 20.

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

SQL의 조건 문제 중 기본적인 문제인 것 같다 .

 

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

 

문제출처

 

자동차 대여 기록에서 장기/단기 대여 구분하기

해야할 것들 

1.2022년 9월에 속하는 대여 기록
2.대여기간이 30일 이상 

 *주의 

 end-date - start_date +1 

  +1을 해주는 이유는 같은 날 빌려서 같은 날 반납하면, 대여기간을 0일로 계산하기 때문에 +1을 한다.

  -> 장기
  -> 단기
3. 대여 기록 ID 기준 DESC 

 

SELECT HISTORY_ID
     , CAR_ID
     , TO_CHAR(START_DATE, 'YYYY-MM-DD') AS START_DATE
     , TO_CHAR(END_DATE, 'YYYY-MM-DD') AS END_DATE
     , CASE 
        WHEN END_DATE - START_DATE + 1 >= 30 
            THEN '장기 대여'
            ELSE '단기 대여' 
       END AS RENT_TYPE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
 WHERE TO_CHAR(START_DATE, 'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

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

TODO
자동차 ID 기준으로 그룹바이
AVG(종료일 - 시작일 +1 )
ROUND(AVG(종료일 - 시작일 +1 ), 1)
-ROUND(AVG(종료일 - 시작일 +1 ), 1) 평균을 내고 7 이상인 데이터 필터링 

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

 

다시 카테고리 별 상품 개수 구하기 

/*
TODO 
카테고리 코드 그룹바이 앞 두자리 자르기
상품카테고리 ASC
*/

SELECT SUBSTR(PRODUCT_CODE, 0, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY SUBSTR(PRODUCT_CODE, 0, 2)
ORDER BY CATEGORY ASC;

문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/131529

 

 

조건에 맞는 사용자 정보 조회하기 (서브쿼리)

문자열 합치기  || 

길이 -> 오라클에서는 LENGTH() 

SELECT USER_ID, NICKNAME, (CITY || ' ' || STREET_ADDRESS1 || ' ' || STREET_ADDRESS2) AS 전체주소,
    CASE WHEN LENGTH(TLNO) = 11 THEN SUBSTR(TLNO, 0, 3) ||'-'|| SUBSTR(TLNO, 4, 4) ||'-'|| SUBSTR(TLNO, 8, 4)
    END AS 전화번호
FROM USED_GOODS_USER 
WHERE USER_ID IN (
    SELECT U.USER_ID 
    FROM USED_GOODS_BOARD B INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
    GROUP BY U.USER_ID
    HAVING COUNT(*) >= 3 )
ORDER BY USER_ID DESC ;