OracleDB/OracleDB 코딩테스트 해결과정 12

프로그래머스 스쿨(Oracle - Lv.4) - 오프라인/온라인 판매 데이터 통합하기 ( UNION ALL 합집합 사용하기 / NULL값 컬럼 만들기)

문제 TROUBLE POINT 두 집합을 JOIN이 하면 중복된 데이터를 결합하게 되어 모든 데이터를 통합하는 것이 아니다. 이때 이용 할 것이 UNION 인데.. 두 테이블의 COLUMN의 개수가 다르다. 이때 존재하지 않는 컬럼을 하나 생성하여 서로 합집합 처리를 해야한다. 배워야 할 것 1. NULL AS COLUMN명 NULL값만을 가진 COLUMN을 생성때 쓴다. 지금 문제의 경우 COLUMN의 개수가 차이가 나고 빈값으로 취급하고싶으니 OFFLINE_SALE에 USER_ID를 NULL 처리 NULL AS USER_ID 이렇게 입력해주면 SELECT를 할때 이름은 USER_ID이고 NULL 인 테이블이 조회되게 할수 있다. SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD'),..

프로그래머스 스쿨(Oracle - Lv.4) -자동차 대여 기록 별 대여 금액 구하기 (구간별 다른 값 적용하기 + 값이 없을때)

문제 TROUBLE POINT 트럭의 요금만 계산하는것이니.. CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블을 JOIN하는데 있어서 문제가 존재하지는 않았다. 다만 이제 할인비율을 계산할때 7일 미만인 것을 다루는 것이 불편했다. END_DATE-START_DATE+1을 통해 대여 일을 계산하여 그것에 따른 컬럼을 하나 더 CASE문으로 생성하는데에는 문제가 없지만 DISCOUNT_RATE와 연결을 하기엔 0미만의 값이없다. 생각해보면 OUTER JOIN이나 FULL JOIN을 이용 해도 됬겠지만 그렇게하기엔 일이 너무 커지는 것 같아 논리적으로 더 꼬이기전에 차라리 적당한 하드코딩으로 문제를 해결했다. 해답 SELECT B.HIST..

프로그래머스 스쿨(Oracle - Lv.3) - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (해당 기간에 포함 여부 확인 / 서브쿼리)

문제 TROUBLE POINT 비교해야할 기록이 하나씩이라면 편하게 비교 할텐데.. 똑같은 차량임에도 '대여 가능' , '대여 중' 이 모두 표시하면 당연하게도 오류가 되겠다. 그렇다면 이것을 하나로 줄여낼 편한 방법은 없을지 고민을 하게 되었다. 해결 방안 서브쿼리를 이용하겠다. 모두에게 이름을 붙이는 방향보단, 오히려 해당이 있는것을 찾기 쉽기때문에 먼저 날짜에 해당이 있는 CAR_ID를 모두 다 가져온다. SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE '20221016' BETWEEN TO_CHAR(START_DATE,'YYYYMMDD') AND TO_CHAR(END_DATE, 'YYYYMMDD') 그리고 이 서브쿼리에 CAR_ID가 있다면..

프로그래머스 스쿨(Oracle - Lv.4) - 입양 시각 구하기(2) (FROM DUAL, LEVEL, CONNECT BY) ★배울것 많음

문제 ※예시 예시를 잘 보아야한다! TRY1 당연하게도 DATETIME에서 시간을 얻어낸 후 숫자로 바꾸어 GROUP BY 를 이용하여 그룹화 해준 후 COUNT(*) 하면 끝날 것이라 생각했다. SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) HOUR, COUNT(*) COUNT FROM ANIMAL_OUTS GROUP BY TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) ORDER BY HOUR TROUBLE POINT 위에서 강조 했던 것이 무엇인가? COUNT할 개수가 없어도 HOUR를 0부터 23까지 모두 출력 해야 한다. 그런데 지금의 결과 TABLE은 HOUR가 0부터 6까지, 20부터 23까지가 출력되지 않았다. 필요한 개념 ※시작 발상 0부..

프로그래머스 스쿨(Oracle - Lv.3) - 오랜 기간 보호한 동물(1) (OUTER JOIN / FETCH)

문제 TROUBLE POINT 가장 오래 있던 3마리 라고 하면 DATE값을 크기순서로 나열 했을때 가장 작은 3개를 출력해야 한다. 그런데 이러한 표현을 아직 배우지 않았다. IDEA 우리는 ANIMAL_INS에는 DATETIME있지만 ANIMAL_OUTS에는 데이터타입이 없는 데이터를 찾고싶으니, 크기가 다른 두 테이블을 합치고 싶다. 문제에서 FOREIGN KEY로 ANIMAL_ID를 통해 두 테이블을 합쳐주고, ANIMAL_OUTS테이블의 DATETIME COLUMN이 NULL인 곳을 찾아내겠다. SELECT i.NAME NAME, i.DATETIME DATETIME FROM ANIMAL_INS i FULL OUTER JOIN ANIMAL_OUTS o on i.ANIMAL_ID=o.ANIMAL_I..

프로그래머스 스쿨(Oracle - Lv.3) - 즐겨찾기가 가장 많은 식당 정보 출력하기 (Inner Join과 equal Join을 쓰는 상황 구분하기)

문제 TROUBLE POINT FOOD_TYPE 에 대하여 GROUP BY 로 정리한 후 MAX(FAVORITES)를 불러올 수 있었다. 그러나 SELECT 절에 분류되지 않는 다른 정보가 들어가야하는데 그 정보를 불러오려면 GROUP BY 는 SELECT절에 집계를 제외한 모든 COLUMN을 요구하기때문에 그것이 불가능 했다. SELECT FOOD_TYPE , MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE 이걸 써놓고 하루내내 고민했다... IDEA 그렇다면 위에서 생각한 GROUP BY 로 얻은 레코드테이블과 자기자신의 원문 테이블을 조인하면 어떨까? TRY1 SELECT a.FOOD_TYPE, a.REST_ID , a.REST_NAME, a.FAVORITES..

프로그래머스 스쿨(Oracle - Lv.2) - 재구매가 일어난 상품과 회원 리스트 구하기(등장횟수에 따른 조건 설정)

문제 해결방법 USER_ID와 PRODUCT_ID에 따라 GROUP BY 를 통해 묶어서 출력하는것 까지는 이해를 했다. 이때 이것은 GROUP BY 로 정렬된것에 대한 COUNT를 HAVING 절에서 이용하면 그것들의 등장 횟수를 언급 할 수있다. 해답 SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE GROUP BY USER_ID, PRODUCT_ID HAVING COUNT(*)>1 ORDER BY USER_ID ASC, PRODUCT_ID DESC;

프로그래머스 스쿨(Oracle - Lv.2) - 자동차 평균 대여기간 구하기

문제 정답 SELECT CAR_ID, average_duration FROM( SELECT CAR_ID, ROUND(AVG(END_DATE-START_DATE+1),1) AS average_duration FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY GROUP BY CAR_ID ) WHERE average_duration>=7 GROUP BY CAR_ID, average_duration ORDER BY average_duration DESC, CAR_ID DESC; 문제점 AVERAGE_DURATION을 표현해주기 위해서 FROM 절을 일단 느낌 가는대로 서브쿼리를 작성했다. 이때 FROM 이 서브쿼리 내부에 작성되어야 하는줄알고 썼더니 FROM절이 2개가 되어 오류가 발생했다...

프로그래머스 스쿨(Oracle - Lv.2) - 입양시각구하기(1) (시간형식까지 다맞추기)

제시된문제 SELECT TO_CHAR(DATETIME, 'HH24') as "HOUR", COUNT(*) as "COUNT" FROM ANIMAL_OUTS WHERE TO_CHAR(DATETIME, 'HH24') BETWEEN 9 AND 20 GROUP BY TO_CHAR(DATETIME, 'HH24') ORDER BY TO_CHAR(DATETIME, 'HH24') asc; 문제점 정말 이 상황을 긴밀히 들여다보면 hour의 첫 row가 나는 09 이고 제시한 예시는 9 이다. 이것은 HH24형식이 아닌 숫자의 형식으로 변형해줘야한다. 해결방식 숫자의 ROW명에 TO_NUMBER를 붙여 해결했다... SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) as "HOUR", COU..