일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 내일배움캠프
- Java의 이점
- JVM
- 메서드
- 스파르타내일배움캠프
- Diary 해우소
- #내일배움캠프
- diary
- Git
- TiL_1st_0419
- KPT
- Java
- Github_token
- 인스턴스
- #스파르타내일배움캠프TIL
- static
- 클래스
- 포맷은 최후의 보루
- 감사기록
- 변수의 다양성
- 성장기록
- 객체지향 언어
- 회고록
- #스파르타내일배움캠프
- 스파르타내일배움캠프TIL
- 스레드
- GitHub
- 생성자
- Token
- 해우소
- Today
- Total
몬그로이
SQL 05 본문
필요한 데이터가 서로 다른 테이블에 있을 때 조회하기
기본 형태
1. food_orders 가 가진 order_id 기준으로 조회 (payments 는 가지지 않은 id의 값도 조회됨)
select *
from food_orders left join payments on food_orders.order_id = payments.order_id
2. food_orders 와 payments 둘 다 가지고 있는 order_id 기준으로 조회
select *
from food_orders inner join payments on food_orders.order_id = payments.order_id
테이블에 이름 부여하여 활용한 left join
select f.order_id ,
f.customer_id ,
f.restaurant_name,
f.price,
c.name,
c.age,
c.gender
from food_orders f left join customers c on f.customer_id = c.customer_id
한국 음식의 주문별 결제 수단과 수수료율을 조회하기
(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율)
*결제 정보가 없는 경우도 포함하여 조회
select f.cuisine_type,
f.restaurant_name,
f.price,
p.pay_type,
p.vat
from food_orders f left join payments p on f.order_id = p.order_id
where cuisine_type = 'Korean'
고객의 주문 식당 조회하기
(조회 컬럼 : 고객 이름, 연령, 성별, 주문 식당)
*고객명으로 정렬, 중복 없도록 조회
select distinct c.name,
c.age,
c.gender,
f.restaurant_name
from food_orders f left join customers c on f.customer_id = c.customer_id
order by c.name //또는 1로
주문 가 격과 수수료율을 곱하여 주문별 수수료 구하기
(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 수수료율, 수수료)
*수수료율이 있는 경우만 조회
select f.order_id,
f.restaurant_name,
f.price,
p.vat,
f.price * p.vat vat2
from food_orders f inner join payments p on f.order_id = p.order_id
group by order_id
50세 이상 고객의 연령에 따라 경로 할인율을 적용하고,
음식 타입별로 원래 가격과 할인 적용 가격 합을 구하기
(조회 컬럼 : 음식 타입, 원래 가격, 할인 적용 가격, 할인 가격)
할인 : 나이 -50 * 0.005
* 고객 정보가 없는 경우도 포함하여 조회,
할인 금액이 큰 순서대로 정렬
select cuisine_type,
sum(price),
sum(price*discount_rate) discounted_price
from
(
select f.cuisine_type ,
f.price,
c.age,
(c.age - 50) * 0.005 discount_rate
from food_orders f left join customers c on f.customer_id = c.customer_id
where c.age>=50 //50세 이상만 조회함
) a
group by 1
order by sum(price*discount_rate) desc
1. 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기
평균 음식 주문 금액 기준 : 5,000 / 10,000 / 30,000 / 30,000 초과
평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
두 테이블 모두에 데이터가 있는 경우만 조회, 식당 이름 순으로 오름차순 정렬
select restaurant_name,
case when avg_price <= 5000 then 'price_group1'
when avg_price > 5000 and avg_price <= 10000 then 'price_group2'
when avg_price >10000 and avg_price <= 30000 then 'price_group3'
when avg_price > 30000 then 'price_group4'
end price_group,
case when avg_age < 30 then 'age_group1'
when avg_age between 31 and 39 then 'age_group2'
when avg_age between 41 and 49 then 'age_group3'
else 'age_group4' end age_group
from
(
select f.restaurant_name,
avg(f.price) avg_price,
avg(c.age) avg_age
from food_orders f inner join customers c on f.customer_id = c.customer_id
group by 1
) a
order by 1
'Organizing Docs > SQL Docs' 카테고리의 다른 글
SQL 03 (0) | 2024.06.29 |
---|---|
SQL04 (0) | 2024.06.29 |
SQL 02 (0) | 2024.06.27 |
SQL 01 (0) | 2024.06.27 |
SQL(Structured Query Language) (0) | 2024.05.25 |