SQL

SQL 코드카타 오답: DATE | MAX로 우선 순위가 높은 값 반환하기 | DISTINCT

sawo11 2024. 12. 5. 19:39

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

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

-- 틀리진 않았지만 헷갈렸던 문제
-- 날짜가 밀리초 단위까지 나와있기 때문에 DATE()로 일자까지만 추출하여 비교
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 A.PT_NO = P.PT_NO
JOIN DOCTOR D ON A.MDDR_ID = D.DR_ID
WHERE DATE(A.APNT_YMD) = '2022-04-13' AND A.APNT_CNCL_YN = 'N' AND D.MCDP_CD = 'CS'
ORDER BY A.APNT_YMD;

 

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

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

-- 내가 작성한 쿼리
SELECT CAR_ID,
    CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중'
    ELSE '대여 가능' END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;


-- 정답
-- MAX: 동일한 CAR_ID에 대해 여러 행이 있을 경우, '대여중'과 '대여 가능' 중 우선 순위가 높은 값 반환(사전순으로 '대여중')
-- 동일한 CAR_ID에 대해 여러 행이 있는 경우, 2022년 10월 16일에 대여중이라면 대여중을 출력해야하므로 MAX값 사용하여 처리 
SELECT CAR_ID,
    MAX(IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' ,'대여중', '대여 가능')) AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

[년, 월, 성별 별 상품 구매 회원 수 구하기]

USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

-- GROUP BY: 첫 번째 컬럼만 할 경우 오류 발생 가능
-- COUNT(DISTINCT U.USER_ID): 연, 월, 성별이 중복되지 않는 사용자 추출
SELECT YEAR(O.SALES_DATE) YEAR,
    MONTH(O.SALES_DATE) MONTH,
    U.GENDER,
    COUNT(DISTINCT U.USER_ID) USERS
FROM ONLINE_SALE O
JOIN USER_INFO U ON O.USER_ID = U.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER;