주제 : 엑셀보다 쉽고 빠른 SQL 4weeks
소주제 :Subquery
메모
코드를 입력하세요
select restaurant_name,
sido,
case when avg_time<=20 then '<=20'
when avg_time>20 and avg_time <=30 then '20<x<=30'
when avg_time>30 then '>30' end time_segment
from
(
select restaurant_name,
substring(addr, 1, 2) sido,
avg(delivery_time) avg_time
from food_orders
group by 1, 2
) a
기본적인 연산을 한 후, 해당 결과를 괄호로 묶어 필요한 연산을 한 번 더 실행한다.
```
select cuisine_type,
total_quantity
count_res
case when count_of_restaurant>=5 and count_of_orders>=30 then 0.005
when count_of_restaurant>=5 and count_of_orders<30 then 0.008
when count_of_restaurant<5 and count_of_orders>=30 then 0.01
when count_of_restaurant<5 and count_of_orders<30 then 0.02 end ratio_of_add
from
(
select cuisine_type,
sum(quantity) total_quantity,
count(distinct restaurant_name) count_res
from food_orders
group by 1
) a
1. 음식 타입, 지역별??? 총 주문 수량, 음식점 수 연산하기 (group by 필수)
2. 연산을 다시 할 괄호 지정
3. case 사용해서 단위별 수수료 지정
(할인조건 :
수량이 5개 이하 → 10%
수량이 15개 초과, 총 주문금액이 300000 이상 → 0.5%
이 외에는 일괄 1%)
```jsx
select restaurant_name,
sum_price,
sum_quantity,
case when sum_of_quantity<=5 then 0.1
when sum_of_quantity>15 and sum_of_price>=300000 then 0.005
else 0.01 end discount_rate
from
(
select restaurant_name,
sum(quantity) sum_of_quantity,
sum(price) sum_of_price
from food_orders
group by 1
) a
1. 음식점, 총 주문수량, 총 주문금액 연산하기
2. 해당 연산 괄호 지정
3. 음식점, 할인율(case 사용해서 단위별 할인율 지정) 연산
( ) : 알아보기 쉽게 앞서 연산한 값 다시 불러오기
```
소주제 : Join
메모
-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
```jsx
주문 테이블과 고객 테이블을 cusomer_id 를 기준으로 left join 으로 묶어보기
(조회 컬럼 : order_id, customer_id, restaurant_name, price, name, age, gender)
select a.order_id,
a.customer_id,
a.restaurant_name,
a.price,
b.name,
b.age,
b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
* 테이블도 컬럼처럼 별명을 붙여줄수 있다.
```
(조회 컬럼 : 고객 이름, 연령, 성별, 주문 식당)
*고객명으로 정렬, 중복 없도록 조회
```jsx
select distinct a.name,
a.age,
a.gender,
b.restaurant_name
from customers a inner join food_orders b on a.customer_id=b.customer_id
* 어떤 테이블에서 어떤 컬럼을 이용하고 어떤 수식을 활용할지 미리 생각하자
left join on / order by / distinct : 중복 삭제
```
(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 수수료율, 수수료)
*수수료율이 있는 경우만 조회
```jsx
select a.order_id,
a.restaurant_name,
a.price,
b.vat,
a.price*b.vat "수수료율"
from food_orders a inner join payments b on a.order_id=b.order_id
* 두 테이블의 칼럼을 연산해야할 경우 : 테이블명.칼럼명(연산기호)테이블
```
(조회 컬럼 : 음식 타입, 원래 가격, 할인 적용 가격, 할인 가격)
*할인 : 나이-500.005
*고객 정보가 없는 경우도 포함하여 조회, 할인 금액이 큰 순서대로 정렬
select cuisine_type,
sum(price) "원래 가격",
sum(price)-sum(discount_price) "할인 적용 가격",
sum(discount_price) "할인 가격"
from
(
select a.cuisine_type,
price,
price*((b.age-50)*0.005) discount_price
from food_orders a inner join customers b on a.customer_id=b.customer_id
where b.age>=50
) t
group by 1
order by 4 desc
1. 어떤 테이블 어떤 컬럼을 쓸 건지, left or inner 정하기
2. 불러와야할 칼럼(테이블명 포함)과 연산 작성 후 조회(where로 조건 설정하기)
3. 불러온 칼럼으로 필요한 정보 나열하기
4. 필요하다면 group by, order by로 조건 설정하기