




임의로 구성된 데이터이므로 실제 개인정보와는 연관성이 없습니다.
Since the data is randomly configured, it is not related to actual personal information.




주문내역에서의 주문금액(cost)는 고객의 배달팁이 포함된 금액이기에 실제 음식가격(food_cost)가 아니다.
그래서 임시 컬럼으로 food_cost 컬럼을 만들어서 사용한다.
food_cost = 주문금액 – 배달팁 기본료(3000) – 배달추가지역여부(0/1)*배달팁 추가료(2000)
# food_cost column generate
alter table `order`
add food_cost int generated always as (cost - 3000 - 2000*region_additional_cost) virtual;
# food_cost column erase
alter table `order` drop food_cost;
고객의 변심에 의해서 주문 취소가 발생할 수 있는데 이때 취소된 내역을 따로 저장할 수 있도록 withdraw_order 테이블을 생성했다.
트리거를 통해 주문 취소 발생시 이 테이블에 자동 저장이 된다. (자세한 내용은 Query 2-α 참조)
# 주문취소 내역 테이블 생성(create cancellation table)
create table withdraw_order(
order_number int,
order_time datetime ,
order_history varchar(45) ,
cost int ,
region_additional_cost tinyint ,
CUSTOMER_idCUSTOMER int,
RESTAURANT_company_registration_number int,
DELIVERY_MAN_idDELIVERY_MAN int
);
# 테이블 지우기용 (erase cancellation table)
-- drop table withdraw_order;

# Query1
SELECT O.order_number, R.restaurant_name, O.order_time,O.cost, O.order_history
FROM restaurant AS R, `order` AS O
WHERE R.company_registration_number = 16 AND R.company_registration_number = O.RESTAURANT_company_registration_number
ORDER BY O.order_time DESC
LIMIT 1;
설명(Description)
3-> order(주문) Table에서 음식점 사업자 등록번호가 16인 주문을 찾음
4-> order_time(주문시각)을 최근순으로 나열하고 가장 위의 내역을 가져옴
실행결과(Execution results)

# Query2
select count(*) from delivery where arrival_time is null;
select o.order_number,o.CUSTOMER_idCUSTOMER,o.order_history,o.cost from `order` o, delivery d
where o.CUSTOMER_idCUSTOMER = d.CUSTOMER_idCUSTOMER and
o.DELIVERY_MAN_idDELIVERY_MAN = d.DELIVERY_MAN_idDELIVERY_MAN and
d.arrival_time is null ;

# Query 2-1
drop trigger if exists out_ordertbl;
delimiter $$
create trigger out_ordertbl after delete on `order`
for each row
begin
delete from delivery where CUSTOMER_idCUSTOMER = old.CUSTOMER_idCUSTOMER ;
insert into withdraw_order
values(old.order_number, old.order_time, old.order_history, old.cost, old.region_additional_cost,
old.CUSTOMER_idCUSTOMER, old.RESTAURANT_company_registration_number, old.DELIVERY_MAN_idDELIVERY_MAN);
end $$
delimiter ;
delete from `order` where order_number = 11146;
select * from withdraw_order;

# Query3. 음식점 한달 매출
SELECT R.restaurant_name, sum(O.food_cost) as "한 달 매출"
FROM `order` AS O, restaurant AS R
WHERE R.company_registration_number =12 AND O.RESTAURANT_company_registration_number = R.company_registration_number
AND YEAR(ORDER_TIME) = 2022 AND MONTH(ORDER_TIME) = 5;
설명(Description)
3, 4-> 음식점 사업자 등록번호가 12 이고 join한 테이블에서 company_registration_number(사업자 등록번호)가 12로 같은 것을 찾음. 그리고 주문시각이 2022년 5월인 것을 가져옴
1 -> 추출한 데이터 중 음식금액에 대하여 sum 함수를 이용해 합계를 구한 후 출력
실행결과(Execution results)

# Query4
SELECT R.restaurant_name, sum(O.food_cost) * 0.2 as "한 달 배달비용"
FROM `order` AS O, restaurant AS R
WHERE R.company_registration_number = 16 AND O.RESTAURANT_company_registration_number = R.company_registration_number
AND YEAR(ORDER_TIME) = 2022 AND MONTH(ORDER_TIME) =4;

# Query5
drop procedure if exists predictproc;
delimiter $$
create procedure predictproc(in my_id int)
begin
select o.order_number, c.customer_name, o.order_time,
d.expected_duration, date_add(o.order_time, interval d.expected_duration minute) as '도착예정시간'
from `order` o, delivery d, customer c
where d.CUSTOMER_idCUSTOMER = o.CUSTOMER_idCUSTOMER and
d.DELIVERY_MAN_idDELIVERY_MAN = o.DELIVERY_MAN_idDELIVERY_MAN and
d.arrival_time is null and
d.CUSTOMER_idCUSTOMER = my_id and
c.idCUSTOMER = o.CUSTOMER_idCUSTOMER;
end $$
delimiter ;
call predictproc('1125')

# Query6
drop procedure if exists orderproc;
delimiter $$
create procedure orderproc(in customer_id int)
begin
select order_number, order_history, cost, order_time as '주문시각' from `order`
where order_time between date_sub(now(), interval 3 month) and now() and
CUSTOMER_idCUSTOMER = customer_id ;
end $$
delimiter ;
call orderproc(1112);
설명(Description)
3 -> 고객 ID 를 프로시저에서 입력받음
4~8 -> order(주문) 테이블에서 입력받은 고객 ID와 일치하며 현재로부터 3개월 간격의 내에 있는 order_time(주문시각)의 정보만을 추출함
11 -> 고객 ID가 1111인 사람의 최근 3개월 주문내역을 출력함
실행결과(Execution results)

# Query 7
select year(`order`.order_time) '연도', Month(`order`.order_time) '달', sum(`order`.cost) '이번 달 총 주문금액'
from `order`
where `order`.CUSTOMER_idCUSTOMER = 1115 and year(`order`.order_time)=2022 and
Month(`order`.order_time) = 4
설명(Description)
3, 4-> order(주문) 테이블에서 고객 ID가 1111이고 년도가 2022이고 달이 5인 데이터만 가져옴
1 -> 연도와 달 그리고 테이블에서 cost(주문금액)을 다 더한 것을 표시
실행결과(Execution results)

# Query8
drop procedure if exists dailyproc;
delimiter $$
create procedure dailyproc(in d_id int)
begin
select
d.deliveryman_name,
0.7*sum(if ( o.region_additional_cost = '1',5000+o.food_cost*0.2,3000+o.food_cost*0.2))
as '배달원 하루 수익'
from `order` o, delivery_man d
where d.idDELIVERY_MAN = o.DELIVERY_MAN_idDELIVERY_MAN and d.idDELIVERY_MAN = d_id
and year(o.order_time) = 2022 and month(o.order_time) = 5
and day(o.order_time) = 21;
end $$
delimiter ;
call dailyproc(112);
설명(Description)
3 -> daily proc 프로시저 제작하고 d_int라는 정수값을 할당받도록 함
5~8 -> 추가비용지역이면 배달팁이 5000원이고 일반지역은 3000원인 것을 if문으로 분리하고 배달원 수익인 (배달비+배달팁)*0.7을 수식화 시켰음
10-> 우리가 찾고자 하는 배달원 id에 해당하는 table 항목을 불러옴
11~12-> 알고자 하는 하루를 선택함
실행결과(Execution results)

# Query9
drop procedure if exists delayproc;
delimiter $$
create procedure delayproc(in deli_id int, in o_year int, in o_month int)
begin
declare all_count int ;
declare delay_count int ;
select count(*) into all_count
from delivery d
where d.DELIVERY_MAN_idDELIVERY_MAN = deli_id
and year(d.arrival_time) = o_year and month(d.arrival_time) = o_month;
select count(*) into delay_count
from delivery d, `order` o
where d.DELIVERY_MAN_idDELIVERY_MAN = deli_id and
d.CUSTOMER_idCUSTOMER = o.CUSTOMER_idCUSTOMER and
d.DELIVERY_MAN_idDELIVERY_MAN = o.DELIVERY_MAN_idDELIVERY_MAN and
year(o.order_time) = o_year and
month(o.order_time) = o_month and
date_add(o.order_time, interval d.expected_duration minute) < d.arrival_time ;
select (delay_count/all_count)*100 as '배달지연률(%)';
end $$
delimiter ;
call delayproc(114,2022,3);
