SQL/문제

SQL | 재구매가 일어난 상품과 회원 리스트 구하기, 취소되지 않은 진료 예약 조회하기, 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기, 자동차 대여 기록에서 장기/단기 대여 구분하기, 우유와 요거트가 담긴 장바구니

jjangdoll 2025. 1. 3. 11:48

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

https://school.programmers.co.kr/learn/courses/30/lessons/131536

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


-- 동일한 상품 재구매한 동일 회원 아이디와 상품 아이디 출력
-- 회원 아이디 기준 오름차순, 상품 아이디 내림차순
SELECT  USER_ID,
        PRODUCT_ID
FROM    ONLINE_SALE
GROUP BY  USER_ID, PRODUCT_ID	# 회원 아이디, 상품 아이디 그룹
HAVING COUNT(*)>1  				# 카운트 2회 이상 조건
ORDER BY USER_ID, PRODUCT_ID DESC;

💡 HAVING COUNT(*)>1   # 카운트 2회 이상 조건


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

https://school.programmers.co.kr/learn/courses/30/lessons/132204

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


-- 2022년 4월 13일 
-- 취소되지 않은 cs 진료 예약 내역 조회
-- 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시
-- 진료예약일시 기준 정렬
SELECT  a.APNT_NO,
        p.PT_NAME,
        p.PT_NO,
        d.MCDP_CD,
        d.DR_NAME,
        a.APNT_YMD
FROM    APPOINTMENT a 
        JOIN PATIENT p ON p.PT_NO = a.PT_NO 
        JOIN DOCTOR d ON d.DR_ID = a.MDDR_ID  # 조인 두 번 가능
WHERE   d.MCDP_CD = 'CS'
        AND LEFT(APNT_YMD,10)='2022-04-13'
        AND a.APNT_CNCL_YN = 'N'
ORDER BY a.APNT_YMD;

💡 조인 두 번 가능


자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

https://school.programmers.co.kr/learn/courses/30/lessons/157340

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


-- 2022년 10월 16일 대여 '대여중' , '대여 가능' : AVAILABILITY
-- 자동차 아이디, AVAILABILITY 출력
-- 반납날짜가 2022년 10월 16일 인 경우에도 대여중
-- 자동차 아이디 기준 내림차순
SELECT 
    CAR_ID,
    MAX(CASE WHEN START_DATE <='2022-10-16' AND  END_DATE >='2022-10-16' 
            THEN '대여중' ELSE '대여 가능' END) AS AVAILABILITY 
# MAX 함수 쓰인 이유
# 차 아이디 별로 그룹핑했는데 같은 차 중 하나라도 대여중이면 대여중으로 표기하기 위해
FROM 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY 
group by 
    CAR_ID
ORDER BY 
    CAR_ID DESC ;

💡 MAX 함수 쓰인 이유
 : 차 아이디 별로 그룹핑했는데 같은 차 중 하나라도 대여중이면 대여중으로 표기하기 위해

💡 MAX 함수 문자열도 가능


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

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


-- 대여시작일 2022년 9월
-- 대여 기간 30일 이상 '장기 대여', 아니면 '단기 대여'
-- 대여 기록 아이디를 기준 내림차순
SELECT  HISTORY_ID,
        CAR_ID,
        DATE_FORMAT(START_DATE,'%Y-%m-%d') START_DATE,
        DATE_FORMAT(END_DATE,'%Y-%m-%d') END_DATE,
        IF(DATEDIFF(END_DATE,START_DATE)+1>=30,'장기 대여', '단기 대여') RENT_TYPE 	
        	# 대여하고 바로 반남해도 1일로 취금하니까 +1 해야함 
FROM    CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE   DATE_FORMAT(START_DATE,'%Y-%m-%d') LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;

💡 대여하고 바로 반납해도 1일로 취금하니까 +1 해야함


우유와 요거트가 담긴 장바구니

https://school.programmers.co.kr/learn/courses/30/lessons/62284

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


-- 우유와 요거트 동시에 구입한 장바구니
-- 장바구니 아이디순 
SELECT
    CART_ID
FROM
    CART_PRODUCTS
GROUP BY   
    CART_ID
HAVING  GROUP_CONCAT(NAME) LIKE '%Milk%'
AND GROUP_CONCAT(NAME) LIKE '%Yogurt%' ;

💡 GROUP BY CART_ID : 카트 아이디별로 그룹화

💡 HAVING  GROUP_CONCAT(NAME) : 카트 아이디에 있는 상품 종류 하나의 열로 나열