MySQL 조인 관련 질문입니다. 0 2 730

by 찡스쿄 [2020.10.29 09:36:01]


안녕하세요, 선배님들.

쿼리 작성 중에 궁금한 점이 생겼는데요..

다음과 같이 각 조건에 따른 결과를 하나의 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

 

by 마농 [2020.10.29 10:12:59]

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')
;

 


by 찡스쿄 [2020.10.29 11:03:58]

와 ... 마농님 너무나도 깔끔하고 이해하기 쉬운 설명 정말 감사드립니다.

좋은 하루 되세요. ^^~

(오늘 너무나도 큰 걸 배워가네요... 정말 너무너무너무 감사드립니다 ㅠㅠㅠ...)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입