MySQL GROUP BY와 CASE 관련 질문입니다. 0 2 2,599

by 찡스쿄 [MySQL] mysql group by case when [2020.12.03 13:55:22]


screen.PNG (15,007Bytes)

안녕하세요, 선배님들.

MySQL에서 group by가 사용되었을 때,

SELECT 절에 CASE 문이 여러개 포함되어도 상관이 없는지에 대해 여쭈어 보고자 합니다.

 

우선, 기존의 쿼리는 다음과 같습니다.

SELECT 
 CP.cont_nm
,(
	SELECT cont_mony 
	FROM CHG_PLN_MGMT 
	WHERE chg_pln_nm = '라이트' 
	AND cont_nm = CP.cont_nm 
) AS R_cont_mony
,(
	SELECT free_coin 
	FROM CHG_PLN_MGMT 
	WHERE chg_pln_nm='라이트' 
	AND cont_nm=CP.cont_nm
) AS R_free_coin
,(
	SELECT cont_mony 
	FROM CHG_PLN_MGMT 
	WHERE chg_pln_nm='스탠다드' 
	AND cont_nm=CP.cont_nm
) AS S_cont_mony
,(
	SELECT free_coin 
	FROM CHG_PLN_MGMT 
	WHERE chg_pln_nm='스탠다드' 
	AND cont_nm=CP.cont_nm
) AS S_free_coin
,(
	SELECT cont_mony 
	FROM CHG_PLN_MGMT 
	WHERE chg_pln_nm='프리미엄' 
	AND cont_nm=CP.cont_nm
) AS P_cont_mony
,(
	SELECT free_coin 
	FROM CHG_PLN_MGMT 
	WHERE chg_pln_nm='프리미엄' 
	AND cont_nm=CP.cont_nm
) AS P_free_coin
,IF(cont_nm='무약정', 0, 
	IF(cont_nm='1년약정', 1, 
		IF(cont_nm='2년약정', 2, 3))
	) AS orderBy
FROM CHG_PLN_MGMT CP
GROUP BY cont_nm
ORDER BY orderBy;

 

변경된 쿼리는 다음과 같습니다.

SELECT
	  cont_nm
	, IFNULL(CASE chg_pln_nm WHEN '라이트' THEN cont_mony END, 0) AS l_cont_mony
	, IFNULL(CASE chg_pln_nm WHEN '라이트' THEN free_coin END, 0) AS l_free_coin
	, IFNULL(CASE chg_pln_nm WHEN '스탠다드' THEN cont_mony END, 0) AS s_cont_mony
	, IFNULL(CASE chg_pln_nm WHEN '스탠다드' THEN free_coin END, 0) AS s_free_coin
	, IFNULL(CASE chg_pln_nm WHEN '프리미엄' THEN cont_mony END, 0) AS p_cont_mony
	, IFNULL(CASE chg_pln_nm WHEN '프리미엄' THEN free_coin END, 0) AS p_free_coin
FROM
	CHG_PLN_MGMT
WHERE
	us_yn = 'Y'
GROUP BY
	cont_nm

 

결과적으로 출력되어야 하는 화면은 이미지를 첨부하였는데요.

무약정, 1년약정, 2년약정, 1년약정 태블릿을 기준으로

라이트, 스탠다드, 프리미엄 요금제를 뽑아주어야 합니다.

현재 변경된 쿼리와 같이 GROUP BY와 함께 CASE문 각각이 사용되어도 문제가 없을까요?

만약, 문제가 된다고 하면 어떠한 방식으로 쿼리를 변경해야 할지 피드백을 주시면 감사하겠습니다!..

날씨가 많이 춥습니다..

감기, 코로나 조심하시기 바랍니다!

감사합니다.

 

by 마농 [2020.12.03 14:42:05]

변경전 쿼리는 성능상 문제가 있고
변경후 쿼리는 성능이 개선됩니다. 문제 없구요.
다만. 쿼리가 뭔가 이상합니다.
변경 전,후 쿼리 모두 집계함수가 누락된게 아닌지?
-- 오류 : , IFNULL(CASE chg_pln_nm WHEN '라이트' THEN cont_mony END, 0) AS l_cont_mony
-- 수정 : , IFNULL(SUM(CASE chg_pln_nm WHEN '라이트' THEN cont_mony END), 0) AS l_cont_mony


by 찡스쿄 [2020.12.03 14:48:55]

앗... SUM 함수를 사용하지 않아 각 스탠다드와 프리미엄이 0원으로 출력되었던 것이군요..

답변 감사드립니다, 마농 선생님!

오늘도 좋은 하루 되시고,

행복한 한 주 되시길 바라요. ^^

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