안녕하세요, 선배님들.
쿼리 작성 중에 궁금한 점이 생겼는데요..
다음과 같이 각 조건에 따른 결과를 하나의 ROW로 뽑을 때
각각의 파생 테이블의 WHERE 조건에서 sav_metd를 제외한 나머지 조건은 같을 때
어떻게 하면 좀 더 간결하게 쿼리를 작성할 수 있을까요?..
아무리 생각해도 조인 이외에는 방법이 떠오르지를 않아, 조언을 구해보고자 합니다!
답변 미리 감사드립니다. ^^
SELECT * , (card_total_amt + money_total_amt + other_total_amt) AS total_amt FROM ( SELECT IFNULL(SUM(total_amt), 0) AS card_total_amt FROM STO_PAY_HIST WHERE sto_inh_nbr = 12 AND DATE_FORMAT(pay_dat, '%Y-%m-%d') BETWEEN '2020-09-28' AND '2020-10-28' AND sav_metd = 'C' ) AS CARD , ( SELECT IFNULL(SUM(total_amt), 0) AS money_total_amt FROM STO_PAY_HIST WHERE sto_inh_nbr = 12 AND DATE_FORMAT(pay_dat, '%Y-%m-%d') BETWEEN '2020-09-28' AND '2020-10-28' AND sav_metd = 'M' ) AS MONEY , ( SELECT IFNULL(SUM(total_amt), 0) AS other_total_amt FROM STO_PAY_HIST WHERE sto_inh_nbr = 12 AND DATE_FORMAT(pay_dat, '%Y-%m-%d') BETWEEN '2020-09-28' AND '2020-10-28' AND sav_metd = 'O' ) AS OTHER
1. 개별 조건 처리 방법
- 공통조건은 WHERE 절에
- 개별조건은 SELECT 절에서 CASE 문으로
2. 컬럼 가공 조건 비효율
- 컬럼을 가공하여 조건에 맞추지 말고
- 조건을 가공하여 컬럼에 맞춰 주세요.
SELECT IFNULL(SUM(CASE sav_metd WHEN 'C' THEN total_amt END), 0) card_total_amt , IFNULL(SUM(CASE sav_metd WHEN 'M' THEN total_amt END), 0) money_total_amt , IFNULL(SUM(CASE sav_metd WHEN 'O' THEN total_amt END), 0) other_total_amt , SUM(total_amt) total_amt FROM sto_pay_hist WHERE sto_inh_nbr = 12 AND pay_dat >= DATE_ADD('2020-09-28', INTERVAL 0 DAY) AND pay_dat < DATE_ADD('2020-10-28', INTERVAL 1 DAY) AND sav_metd IN ('C', 'M', 'O') ;