SQL 개인 과제 - 문제4. 고과금 결제 비율 분석
총 5개의 쿼리를 작성해 주시면 됩니다.
1. 각 결제 수단별 평균 결제 금액을 구하는 쿼리를 작성하세요.(1개 쿼리 작성)
출력: payment_type, avg_payment
결제 수단별 평균 => 집계함수 필요
2. 각 결제 수단별 평균 결제 금액보다 높은 주문만 조회하세요.(4개 쿼리 작성)
출력: order_id, payment_type, payment_value
필터링 조건에서 사용될 평균금액을 구하기 위해 서브쿼리 사용해야함
출력 결과 예시
#결재수단별 평균 결제금액 구하기
credit_card | 156.5113197279
boleto | 126.5988172043
voucher | 75.5836842105
debit_card | 122.6527272727
#결제수단별(credit_card 외 3가지) 평균보다 높은 결제만 조회 결과
1f78449c87a54faf9e96e88ba1491fa9 | credit_card | 341.09
d88e0d5fa41661ce03c6fcf336527646 | credit_card | 188.73
12e5cfe0e4716b59afbb0ef4a3bd6570 | credit_card | 157.45
8ac09207f415d55acff302df7d6a895c | credit_card | 244.15
4214cda550ece8ee66441f459dc33a8c | credit_card | 170.57
4d680edbaa7d3d9bed69532957368a03 | credit_card | 353.09
d0a945f85ba10746b0aac9734de7240e | credit_card | 201.05
5d9c58172e78892b7489d90bfa28ade8 | credit_card | 290.16
b2bb080b6bc860118a246fd9b6fad6da | credit_card | 173.84
문제풀이
1번 답 :
select payment_type,
ROUND(avg(payment_value ),2)
from marketer_payments mp
group by payment_type;
하다보니까 알아서나옴 하면할수록 재밌는 것 같다;;
2번답
1) credit_card
select payment_type,
AVG(payment_value) AS avg_payment
from marketer_payments mp1
group by payment_type
1~4 번 에서 너무 어렵게 생각한게 저 평균값을 서브쿼리로 썼는데 그냥 평균값 숫자를 입력해도 됬었다.. > 아님 이건 하드코딩이라 서브쿼리로 하는게 맞음
1. 크레딧 카드
select order_id,
payment_type,
payment_value
from marketer_payments
where payment_type = 'credit_card' AND payment_value > (select AVG(payment_value) from marketer_payments where payment_type = 'credit_card');
2.
select order_id,
payment_type,
payment_value
from marketer_payments
where payment_type = 'boleto'
AND payment_value > (select avg(payment_value) from marketer_payments where payment_type = 'boleto');
3.
select order_id,
payment_type,
payment_value
from marketer_payments
where payment_type = 'voucher'
AND payment_value > (select avg(payment_value) from marketer_payments where payment_type = 'voucher');
4.
WITH avg_table AS (
SELECT payment_type,
AVG(payment_value) AS avg_payment
FROM marketer_payments
GROUP BY payment_type
)
SELECT mp.order_id,
mp.payment_type,
mp.payment_value
FROM marketer_payments mp
JOIN avg_table a
ON mp.payment_type = a.payment_type
WHERE mp.payment_type = 'debit_card'
AND mp.payment_value > a.avg_payment;
먼저 결제 타입을 알아야함으로 1번쿼리로 결제타입을 확인한다.
credit_card, boleto, voucher, devit_card
1번 쿼리를 살려둔채로
나와야하는 colum = order_id, payment_type, payment_value
from marketer_payments mp2(편의상)
where payment_type = 'credit_card'(크레딧 카드로 한정하되 표출되는 목록을 분류하기 AND(평균이상값) payment_value > (select AVG(payment_value) from marketer_payments mp1 where payment_type = 'credit_card')
여기서 서브쿼리에 웨어절을 넣는 이유는 크레딧 값의 평균값을 구하기 위해서
마지막 4번은 왠지 크레딧부터 하면3번하면서 기껏해서 1번 쿼리문제를 해결해놓고 결과값 못사용하고 서브쿼리로만 돌리는것 같아서 내가 구한값 그대로 쓰는 방법어디없나 하다 찾은것.
1. 장점은 CTE (WITH) 구절을 사용할때 내가 1번에 해놓은값 복붙하면되는ㄴ 편리함
2. 단점은 너무길어서 외워서는 못할것같고..
3.