-
SQL 고득점 킷 JOIN자료구조와 알고리즘/문제풀기 2023. 9. 1. 12:49
1. 주문량이 많은 아이스크림 구하기
- 내 코드
-- -- 코드를 입력하세요 -- 토탈 오더 더한 거 TOP -N 구해야함 -- FIRST_HALF 기본기 : 맛 , 외래키 SHIPMENT_ID -- JULY 기본기 SHIPMENT_ID 외래키 맛 -- => JULY를 맛 별로 그룹해서 일단 맛별 토탈 오더 구하고 -- > FIRST_HALF와 맛별로 조인 + 토탈 오더를 더한다. 이를 정렬한다. -- > 여기서 ROWNUM 3까지 구함 WITH JY as (SELECT SUM(TOTAL_ORDER) TOTAL_ORDER ,FLAVOR FROM JULY GROUP BY FLAVOR) SELECT FLAVOR FROM (SELECT jy.FLAVOR, jy.TOTAL_ORDER + fh.TOTAL_ORDER as TOTAL FROM FIRST_HALF fh JOIN JY jy ON (fh.FLAVOR = jy.FLAVOR) ORDER BY TOTAL WHERE ROWNUM <= 3;
-> WITH절에 중첩 안됨 연속으로 미리 만들어둔 서브쿼리 다음 서브쿼리에서 사용안됨
-> as 키워드는 SELECT 절에만 사용가능 FROM은 바로 별칭
SELECT T.FLAVOR FROM ( SELECT FH.FLAVOR, SUM(FH.TOTAL_ORDER) + SUM(J.TOTAL_ORDER) as TOTAL FROM FIRST_HALF FH INNER JOIN JULY J ON (FH.FLAVOR = J. FLAVOR) GROUP BY FH.FLAVOR ORDER BY TOTAL DESC) T WHERE ROWNUM <= 3;
2. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
SELECT ccr.CAR_ID, ccr.CAR_TYPE, ccr.DAILY_FEE * 30 * (1-(ccdp.DISCOUNT_RATE/100)) AS FEE FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN ccdp JOIN CAR_RENTAL_COMPANY_CAR ccr ON (ccdp.CAR_TYPE = ccr.CAR_TYPE) WHERE ccr.CAR_ID NOT IN (SELECT ch.CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY ch WHERE TO_CHAR(END_DATE,'YYYYMMDD') >'20221101' AND TO_CHAR(START_DATE,'YYYYMMDD') <'20221201') AND ccdp.DURATION_TYPE ='30일 이상' AND ccr.CAR_TYPE IN ('세단','SUV') AND ccr.DAILY_FEE * 30 * (1-(ccdp.DISCOUNT_RATE/100)) BETWEEN 500000 AND 2000000 ORDER BY FEE DESC, ccr.CAR_TYPE, ccr.CAR_ID DESC;
- 굉장히 어려웠다.
* 오라클 날짜자료형 비교 TO_CHAR 이용하는 법
SELECT ch.CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY ch WHERE TO_CHAR(END_DATE,'YYYYMMDD') >'20221101' AND TO_CHAR(START_DATE,'YYYYMMDD') <'20221201')
- 모든 데이터 중에 시작날짜는 12월 1일보다 작으면서, 렌탈 종료날 짜는 11월 1일보다 큰 애들 제외
- 위 쿼리 결과로 CAR_ID 해당하는 CAR_ID가 나옴 -> 이를 비교하며 제외
* HISTORY 컬럼임 -> ID별로 대여에 모든 데이터들이 나옴
3. 오랜기간 보호한 동물
SELECT ai.NAME,ai.DATETIME FROM (SELECT ai.NAME, ai.DATETIME FROM ANIMAL_INS ai LEFT OUTER JOIN ANIMAL_OUTS ao ON(ai.ANIMAL_ID = ao.ANIMAL_ID) WHERE ao.ANIMAL_ID IS NULL ORDER BY ai.DATETIME) ai WHERE ROWNUM <= 3;
- TOP-N만 사용할 수 있으면 비교적 쉽게 풀 수 있다.
4. 없어진 기록
SELECT ao.ANIMAL_ID, ao.NAME FROM ANIMAL_OUTS ao LEFT OUTER JOIN ANIMAL_INS ai ON (ao.ANIMAL_ID = ai.ANIMAL_ID) WHERE ai.ANIMAL_ID IS NULL ORDER BY ao.ANIMAL_ID;
5. 있었는데요, 없었습니다.
SELECT ai.ANIMAL_ID, ai.NAME FROM ANIMAL_INS ai INNER JOIN ANIMAL_OUTS ao ON(ai.ANIMAL_ID = ao.ANIMAL_ID) WHERE ai.DATETIME > ao.DATETIME ORDER BY ai.DATETIME;
- 있었는데요 없었습
6. 그룹별 조건에 맞는 식당 목록 출력하기
- 내 풀이
SELECT mp.MEMBER_NAME, rs.REVIEW_TEXT, TO_CHAR(rs.REVIEW_DATE,'YYYY-MM-DD') as REVIEW_DATE FROM MEMBER_PROFILE mp JOIN REST_REVIEW rs ON (mp.MEMBER_ID = rs.MEMBER_ID) WHERE mp.MEMBER_ID IN ( SELECT rr.MEMBER_ID FROM REST_REVIEW rr GROUP BY rr.MEMBER_ID HAVING COUNT(*) = ( SELECT MAX(cnt) FROM (SELECT COUNT(*) cnt FROM REST_REVIEW GROUP BY MEMBER_ID)) ) ORDER BY REVIEW_DATE,REVIEW_TEXT;
- 중첩이 많다..
7. 5월 식품들의 총매출 조회하기
SELECT fp.PRODUCT_ID, fp.PRODUCT_NAME, (fo.AMOUNT * fp.PRICE) as TOTAL_SALES FROM (SELECT fo.PRODUCT_ID,SUM(fo.AMOUNT) as AMOUNT FROM FOOD_ORDER fo WHERE TO_CHAR(fo.PRODUCE_DATE,'YYYYMM') = 202205 GROUP BY fo.PRODUCT_ID ) fo INNER JOIN FOOD_PRODUCT fp ON (fo.PRODUCT_ID = fp.PRODUCT_ID) ORDER BY TOTAL_SALES DESC, fp.PRODUCT_ID;
8. 보호소에서 중성화한 동물
SELECT ai.ANIMAL_ID, ai.ANIMAL_TYPE, ai.NAME FROM ANIMAL_INS ai WHERE ai.SEX_UPON_INTAKE LIKE '%Intact%' AND ai.ANIMAL_ID IN ( SELECT animal_id FROM ANIMAL_OUTS ao WHERE ao.SEX_UPON_OUTCOME LIKE 'Neutered%' OR ao.SEX_UPON_OUTCOME LIKE 'Spayed%');
'자료구조와 알고리즘 > 문제풀기' 카테고리의 다른 글
배열 (0) 2024.01.12 문자열 (0) 2024.01.10 백준 15990 - 1,2,3 더하기 5 (0) 2023.04.14 백준 11052 - 카드 구매하기 (0) 2023.04.14 백준 11727 - 2 X N 타일링 2 (0) 2023.04.14