제목: 있었는데요 없었습니다 

레벨: LEVEL 3

 

으아아 폭풍문제풀이 가보자고~

 

 

이 문제는 테이블에 외래키도 껴있고 그러니까 먼저 데이터설명을 보는 게 좋다.

 

 

관리자형.. 실수를 멈춰주라..😩

실수는 관리자가 하고 역시 수습하는 건 나같은 사원이구나..

암턴 

문제를 요약하면 지금 바쁘다바빠 실수사회이기 때문에 

입양일이 잘못됐다. 그래서 보호 시작일보다 입양일이 빠른 애들은 쇽쇽 골라야 한다.

 

ANIMAL_INS 테이블과 ANIMAL_OUT테이블을 먼저 합친 뒤 

각 테이블의 날짜를 비교하여 조건에 해당하는 데이터를 빼내자.

 

정답은 이렇게 작성했다.

비교적 간단한 문제였으나 가장 고민이었던 건 WHERE절에 있는 부등호였다.

 

뭐 숫자는 부등호가 바로바로 이해되지만 날짜도 부등호에 적용될까..?

하는게 의문이었다!

그런데 해보니 됐다.

 

날짜의 부등호는 앞선 날짜가 더 작은 쪽,

뒤에 있는 날짜가 더 큰쪽이라고 생각하면 된다.

 

즉, 우리는 보호시작일(보호소 입소일)보다 입양일이 빠른 데이터(잘못된 데이터)를

찾는 것이기 때문에 

입소일(ANIMAL_INS.DATETIME) > 입양일(ANIMAL_OUTS.DATETIME)

으로 조건을 적으면 된다.

 

 

최종정리

 

SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME

→ 가져올 데이터의 컬럼을 작성하자. 동물아이디와 동물이름을 가져올 것이다.


from ANIMAL_INS

→ 가져올 데이터가 있는 테이블을 작성하자.

 

left join ANIMAL_OUTS on ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID

→ 기준 테이블과 합칠(JOIN) 테이블을 작성한다. 그래야 WHERE절에 있는 조건을 적용하여 원하는 값을 더을 수 있다.


where ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME

→ 값의 기준이 되는 날짜 비교를 WHERE절에 넣어준다. 간단하게 부등호로 하기!


order by ANIMAL_INS.DATETIME;

→ 마지막으로 정렬순서. 오류가 없는 보호시작일로 정렬하는데 이때 

보호시작일이 빠른 순서이기 때문에 오름차순으로 하면 된다.

오름차순은 ORDER BY의 기본설정이라 따로 키워드를 안줘도 된다.

 

 

 

 

제목: 오랜 기간 보호한 동물(1)

레벨: LEVEL 3

 

으아 문제 가!

 

이건 테이블 조건이다.

 

이것이 문제!

 

문제를 요약하자면

ANIMAL_INS 테이블은 보호중인 동물 정보,

ANIMAL_OUTS는 입양간 동물 정보이다.

 

이때 아직 입양 못간 동물의 입양과 보호시작일을 조회하는 테이블을 만들자.

 

조건 1 : 결과는 보호시작일 순으로 조회

조건 2 : 3마리 동물만 보여주고 그 이상이면 가차없이 자를 것!

 

당연히 보호하는 동물보다 입양간 동물이 적기 때문에

ANIMAL_OUTS 테이블의 데이터가 적다!

 

그래서 아직 입양 못간 동물리스트를 뽑고 싶다면

쉽게 생각해서 

ANIMAL_INS  - ANIMAL_OUTS = 남은 데이터(아직 보호소에 있는 애들) 이라고 생각하면 되겠다!

 

그럼 ANIMAL_INS, ANIMAL_OUTS 두 테이블을 합치고 

여기서 ANIMAL_OUTS.DATETIME(입양간 날짜)가 NULL값인 데이터만 뽑아오면 된다!

 

이때 데이터가 없어도 NULL로 표시되는 JOIN을 해야 하는데 그게 바로 LEFT JOIN!!!

 

 

 

이렇게 작성하였다!

 

LEFT JOIN은 기준 테이블 옆에 새로운 테이블을 접목시켜서 데이터를 보여준다.

그래서 ANIMAL_OUTS에는 있는데 ANIMAL_INS에는 없는 데이터는 NULL값으로 표시된다.

 

그래서 이 NULL을 가진 데이터를 뽑기 위해 

WHERE절에 그 조건을 작성한다.

 

이때 형식은 컬럼명 IS NULL 이라고 하면된다.

 

 

최종정리

 

SELECT ANIMAL_INS.NAME as NAME, ANIMAL_INS.DATETIME as DATETIME

→ 가져오고자 하는 컬럼명을 작성한다.


from ANIMAL_INS

→ 가져오고자 하는 데이터가 있는 테이블을 작성한다.


LEFT join ANIMAL_OUTS on ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID

→ 기준테이블 왼쪽에 붙일 테이블을 작성한다.

NULL을 보기 위해서 LEFT JOIN이 필요하다.


WHERE ANIMAL_OUTS.DATETIME IS NULL

→ 가져올 데이터의 조건을 작성한다.

보통 특정값을 가져오기 위해서는 <컬럼명 = '원하는 값'> 같은 형식인데

NULL은 = 를 쓰지 않는다.

 

IS NULL이라고 쓰니 주의할 것!

 


ORDER BY ANIMAL_INS.DATETIME

→ 잠시 잊고 있던 정렬순서 조건.

입양가지 못한 동물들이니 입양날짜가 있을리 없고,

보호시작일 순으로 정렬하기 때문에 ANIMAL_INS이라는 테이블을 반드시 써준다.

 


LIMIT 3;

3마리 이상인 경우 상위 3마리만 노출되게 하기 위해 

LIMIT이라는 키워드를 쓴다.

5마리만 보여주고 싶으면 LIMIT 5 라고 쓰면 된다.

제목: 상품 별 오프라인 매출 구하기

레벨: LEVEL2 

 

문제 가보자고~

 

호~ 특별히 주의 사항은 없다.

 

문제요약을 하자면 PRODUCT테이블과 OFFLINE_SALE 테이블을 합치고 

상품코드 컬럼, 매출액 컬럼을 가져오면 된다.

 

대신! 매출액은 판매가x판매량으로 계산해야하기 때문에 사칙연산을 써야한다.

 

 

 

정답은 이렇게!

 

여기서 중요한 건 GROUP BY와 매출액 사칙연산이다.

GROUP BY는 쉽게 말해 특정 컬럼을 그룹화하는 것이다.

 

 

만약 그룹화를 하지 않으면 

 

TYPE SALES_AMOUNT
1 4
1 2
2 3
4 7

 

이렇게 같은 타입이어도 각각 칸을 가지고 나타난다. 하지만 GROUP BY TYPE을 하게 되면

 

TYPE SALES_AMOUNT
1 6
2 3
4 7

 

이렇게 나온다. 여러개 보였던 타입1이 하나로 합쳐진 것!

 

문제를 보면 OFFLINE_SALE 테이블의 PRODUCT_ID 컬럼에는 중복되는 아이디가 많다.

이것을 GROUP BY로 그룹화를 시켜준 것이다.

 

이때! GROUP BY로 그룹화가 되면 SALES_AMOUNT 역시 그룹화에 따라서 합쳐져야 한다.

그렇기 때문에 SUM을 이용해 PRODUCT_ID = 1이 가진 SALES_AMOUNT를 모두 합치고 

거기에 PRICE를 곱해야 지금까지 판매된 매출액을 확인할 수 있다!!!

주의해서 작성할 것.

 

최종정리

 

SELECT PRODUCT.PRODUCT_CODE, SUM(OFFLINE_SALE.SALES_AMOUNT)*PRODUCT.PRICE as SALES

→ 가져올 컬럼을 작성한다. 이때 매출액은 판매가x판매량이므로 이에 해당하는 컬럼을 작성한다.

단 상품코드로 그룹화하였기 때문에 상품코드에 따른 상품판매량을 합산하여 보기 위해 SUM을 쓴다.

 

from PRODUCT 

프로덕트 테이블 가져와

 

join OFFLINE_SALE on PRODUCT.PRODUCT_ID = OFFLINE_SALE.PRODUCT_ID

오프라인 세일 테이블을 합친다. ON 뒤에 겹치는 컬럼 쓰기 잊지 말자.

 

GROUP BY PRODUCT.PRODUCT_CODE

그룹화를 위한 코드

 

order by SALES DESC, PRODUCT_CODE;

  언급하진 않았지만 조건 중에 하나였던 정렬순서!

정렬순서는 2가지 조건이 있었는데

1. 매출액 기준으로 내림차순

2. 매출액이 같다면 상품코드 기준으로 오름차순 이다.

 

정렬을 여러기준 쓰고 싶다면 중간에 콤마만 붙여서 쓰면 된다.

 

ORDER BY 정렬기준1, 정렬기준2, 정렬기준3 ... ;

 

 

이때 내림차순이라면 정렬기준 뒤에 DESC를 붙이면 된다.

내림차순은 반드시 키워드를 작성해야 하며 

오름차순은 ORDER BY 기본조건이라 붙이지 않아도 되지만 

굳이 붙이고 싶다면 ASC 키워드를 쓰면 된다!

제목: 조건에 맞는 도서와 저자 리스트 출력하기

레벨: Level2

 

문제를 풀어보자

 

 

 

딱 봤을 때 문제는

 

BOOK 테이블과 AUTHOR 테이블을 조인하여 합친 뒤 

필요한 컬럼을 조건에 맞게 빼오면 된다.

 

 

필요 컬럼: BOOK_ID, AUTHOR_NAME, PUBLISHED_DATE

조건 : 1. 카테고리 중 경제 카테고리에 속할 것 2. 출판일을 기준으로 오름차순

 

오키 쉽다 가보자고~

 

 

처음에는 이렇게 작성했었는데 틀렸다.

그리고 문제를 다시 보니 주의사항이 붙어있었다.

 

 

하지만 내가 작성한 코드의 결과를 보니 조금 달랐다.

 

바로 년도-월-일 시:분:초 까지 나온 것~

 

참고로 문제의 데이터 구조는 이렇게 생겼는데..

 

문제가 되는 published_date의 타입은 DATE로

데이트 타입의 서식은 YYYY-MM-DD가 맞다.

 

하지만 코드 작성할 땐 아닌갑네.. 🤔

 

그럼 이제 날짜의 형식을 변경해주는 함수를 찾아 나섰다.

 

그것은 바로 DATE_FORMAT!

 

 

DATE_FORMAT(변환하고자 하는 컬럼명(또는 데이터), '바꾸고자 하는 날짜형식')

 

으로 입력하면 된다.

 

그래서 DATE_FORMAT(BOOK.PUBLISHED_DATE, '%Y-%m-%d')

 

라고 적으면 YYYY-MM-DD의 결과값을 얻을 수 있다!

 

 

 

성공~

 

 

최종정리

 

SELECT BOOK.BOOK_ID as BOOK_ID, AUTHOR.AUTHOR_NAME as AUTHOR_NAME,
DATE_FORMAT(BOOK.PUBLISHED_DATE, '%Y-%m-%d') as PUBLISHED_DATE

 

select에는 내가 가져오고자 하는 컬럼명을 써준다.

이때 2개의 테이블에서 가져오니까 테이블명.컬럼명 으로 작성해야 한다.

as 뒤에는 결과창에 나타날 컬럼명을 작성하는 것으로 as를 쓰지 않으면 기존 컬럼명이 그대로 들어간다.


FROM BOOK 

→ 데이터를 가져올 테이블을 지정, BOOK테이블에서 데이터를 가져올 것이다.


LEFT JOIN AUTHOR ON BOOK.AUTHOR_ID = AUTHOR.AUTHOR_ID

→ BOOK테이블과 AUTHOR 테이블을 합친다.

이때 left join으로 book, author테이블을 결합하는데 기준 테이블의 왼쪽에 테이블을 붙인다는 것이다.

이렇게 하면 book에는 있으나 author테이블에는 없는 값은 null로 출력이 된다.

on 뒤에는 두 테이블이 동일하게 가지고 있는 컬럼을 연결한다.


WHERE BOOK.CATEGORY = '경제'

→ 표시할 데이터의 조건을 작성한다. 경제 카테고리의 책만 표시할 것이니 카테고리를 경제라고 지정한다.


ORDER BY BOOK.PUBLISHED_DATE ASC;

어떤것을 기준으로 정렬할 것인지 작성한다.

출판일을 기준으로 할 것이기 때문에 출판일 컬럼(BOOK.PUBLISHED_DATE)을 넣는다.

order by는 기본적으로 오름차순이지만 프로그래머스 답안 제출시 정확도를 높이기 위해 오름차순으로 하는 ASC를 추가하였다.

 

반대로 내림차순으로 하고 싶다면 ASC 대신 DESC를 넣으면 된다!

 

 

+ Recent posts