오늘도 SQL 학습이다.

아무래도 java와 매일 왔다갔다 하면서 배우기 보다는

주 간격으로 따로 학습하는것이 조금 덜 헷갈리지 않을까 싶다.

 

 

액셀보다 쉽고 빠른 SQL

엑셀보다 쉽다는 생각이 잘 들지 않음

 

 

 

이것은 바로 어제 SQL 문제풀이에서 봤던 내용이다.

본의 아니게 예습을 해버림

 

어제 놓쳤던 부분이 있는데, date_format 함수를 사용하려면

해당 컬럼이 날짜 형식의 데이터 서식으로 되어 있어야 한다.

 

DBeaver 에서는 시계모양으로 데이터의 서식을 알 수 있으며, 

만약 문자열(ABC) 서식일 경우 

 

date(칼럼명) 으로 날짜형식의 서식으로 변경할 수 있다.

당연하지만 이 때, 칼럼내 데이터가 날짜에 관련된 내용이어야 한다.

select date(date) date_type,
       date_format(date(date), '%Y') "년",
       date_format(date(date), '%m') "월",
       date_format(date(date), '%d') "일",
       date_format(date(date), '%w') "요일"
from payments

date() 와  date_format 함수를 적용한 모습

 

 

어제 학습한 내용처럼, 다른 내용들 또한 표시 할 수 있다.

 

 

어떤 데이터든 간에, 데이터가 기록된 시간은 굉장히 중요하고 항상 필요로 하기 때문에

date_format 은 꼭 알아둬야 할 것 같다.

 

 

 

어김없이 돌아온 숙제 시간

 

아쉽게도 date 에 해당하는 내용은 아니다.

 

우선, 음식 타입별, 연령별 주문건수 를 구하고 서브쿼리를 활용해

pivot view 를 구성하면 될 것 같다.

(사실 처음 봤을땐 역시나 뇌가 정지했지만, 어제 미리 해봤기 때문에 오늘은 다르다 !)

 

우선, 음식 타입의 내용은 food_orders  table에 있고

age 내용은 customers  table 에 있기 때문에 

SELECT * 
from food_orders fo inner join customers c on fo.customer_id = c.customer_id

두 table을 join 해준다

customers 의 내용이 null이라면 카운트할 이유가 없기 때문에 inner join을 써줌

 

10~59세만 해당하기 때문에 where 에서 걸러주고, 

나이대를 case when  으로 나눠준다

 

SELECT cuisine_type,
		case when age between 10 and 19 then '10'
		     when age between 20 and 29 then '20'
		     when age between 30 and 39 then '30'
		     when age between 40 and 49 then '40'
		     when age between 50 and 59 then '50'		
		end sage
from food_orders fo inner join customers c on fo.customer_id = c.customer_id 
where age >= 10 and age <= 59

 

when ~ 복붙을 할 때는 언제나 꼼꼼히 수정해야함

(case 도 같이 복사하면 즉시 에러)

그 다음  group by 1,2 로 음식별, 나이대별로 그룹정렬을 해준 뒤

count(1) 을 추가해서 음식점별, 나이대 별 주문 수량을 count 

 

이후 서브쿼리로 넘어가서 pivot view를 구성해주면 마무리인데

 

이 부분에서 에러가 계속 나와서 엄청 헤맸다  

메인쿼리 끝에 명칭지정을 안해주면 에러가 나는것임.. 왜 그런지는 모르겠지만

 

(메인쿼리 ) a   이 a가 꼭 필요

SELECT cuisine_type,
		max(if(sage='10', count_order, 0)) "10대",
		max(if(sage='20', count_order, 0)) "20대",
		max(if(sage='30', count_order, 0)) "30대",
		max(if(sage='40', count_order, 0)) "40대",
		max(if(sage='50', count_order, 0)) "50대"		
from
(
SELECT cuisine_type,
		case when age between 10 and 19 then '10'
		     when age between 20 and 29 then '20'
		     when age between 30 and 39 then '30'
		     when age between 40 and 49 then '40'
		     when age between 50 and 59 then '50'		
		end sage,
		count(1) count_order
from food_orders fo inner join customers c on fo.customer_id = c.customer_id
where age >= 10 and age <= 59
group by 1, 2
) a
group by 1

 

복붙신공 max  if절로 pivot view 를 구성한다.

그다음 음식별로 묶기 위해 다시 group by 1 을 해주면 완성

order by 에 대한 내용은 없기 때문에 여기서 마무리 !!

 

잘 잘동한다. 예습하길 잘했다 !

 

 

엑셀보다 쉽고 빠른 SQL

사전캠프 강의 부분은 이것으로 마무리가 되었다.

기초적인 부분이었으나 아직 활용 부분에서 많이 서투르고 기억이 나지 않을 때가 있다.

그래도, 이해가 안되는 부분은 없기 때문에 다행인것같다.

 

강의 속 튜터님은

완전히 이해하고 외우는것보다 조금씩 익숙해는것이 중요하다고 하셨지만,

 

아무래도 기초에 해당하는 내용은 어느정도 완벽에 가까워야 하지 않을까?

 

남은 사전캠프 기간동안 다른 유튜브 영상이나 SQL 문제풀이 를 통해

SQL 의 기초적인 부분을 계속 학습해야 할 것 같다.

 

'사전캠프' 카테고리의 다른 글

16일차 - Javascript 입문 수업  (0) 2024.07.11
15일차 - Javascript 입문 수업  (0) 2024.07.10
13일차 - 알고리즘 풀이  (0) 2024.07.08
12일차 - 액셀보다 쉽고 빠른 SQL  (0) 2024.07.04
11일차 - 알고리즘 풀이  (1) 2024.07.03

+ Recent posts