MySQL UNION GROUP BY 관련 질문입니다. 0 2 2,190

by 찡스쿄 [MySQL] mysql union group by [2020.11.25 15:15:09]


screen.PNG (6,646Bytes)
MSG_MGMT.PNG (16,139Bytes)
SMS.PNG (19,194Bytes)
MMS.PNG (33,069Bytes)

안녕하세요, 선배님들.

메시지 발송과 관련하여 쿼리 작성 중에 문제가 생겨 조언을 얻어보고자 글을 올립니다.

우선, 결과 화면은 첫 번째로 첨부한 이미지와 같습니다.

발송 결과(sendResult=6)를 기준으로 1과 0을 GROUP BY 한 결괏값이 필요한데요.

쿼리는 다음과 같습니다.

       SELECT
					COUNT(*)
				FROM
				(
					SELECT
						  sms_msg_id -- SMS 메시지 고유번호
						, DATE_FORMAT(sendDT, '%Y-%m-%d') AS sendDT -- SMS 메시지 발송일
						, (sendResult=6) AS sendResult -- SMS 발송 결과
					FROM
						MSG_MGMT mm
					INNER JOIN OShotSMS os ON mm.sms_msg_id = os.MsgID
					UNION ALL
					SELECT
						  mms_msg_id -- MMS 메시지 고유번호
						, DATE_FORMAT(sendDT, '%Y-%m-%d') AS sendDT -- MMS 메시지 발송일
						, (sendResult=6) AS sendResult -- MMS 발송 결과
					FROM
						MSG_MGMT mm
					INNER JOIN OShotMMS om ON mm.mms_msg_id = om.MsgID
				)
				AS msg
				GROUP BY
					msg.sendResult

 

성공한 데이터 수와 실패한 데이터 수를 쿼리 마지막의 sendResult를 기준으로 GROUP BY 하는데요,

문제는 날짜별로 검색을 했을 때 SMS 테이블과 MMS 테이블에 검색된 날짜에 INSERT된 데이터가 없으면

결과를 조회할 수 없다는 점입니다..

JOIN으로 변경해볼까도 생각해 보았지만, 컬럼의 연결고리가 없는 것으로 판단이 되고요..

SMS, MMS 테이블과 두 테이블의 PK를 FK로 가지고 있는 MSG_MGMT 테이블을 이용해서

필요한 화면과 같은 결과를 조회하려면 어떠한 방법을 사용할 수 있을까요?...

선배님들의 조언과 답변 미리 감사드립니다!

(사용되는 테이블은 파일로 첨부해 두겠습니다! 위에서부터 MSG_MGMT, SMS, MMS 테이블입니다.)

by 마농 [2020.11.25 15:59:33]
-- 결과가 꼭 2줄로 나와야 하나요?
-- 1줄에 컬럼 나누어 나오면 좋을 듯 합니다.
SELECT COUNT(*) cnt_total
     , COUNT(CASE WHEN sendResult  = 6 THEN 1 END) cnt_success
     , COUNT(CASE WHEN sendResult != 6 THEN 1 END) cnt_fail
  FROM (SELECT sendResult
          FROM msg_mgmt mm
         INNER JOIN oshotmms mms
            ON mm.mms_msg_id = mms.msgID
         WHERE mms.sendDT BETWEEN '2020-11-25' AND '2020-11-25'
         UNION ALL
        SELECT sendResult
          FROM msg_mgmt mm
         INNER JOIN oshotsms sms
            ON mm.mms_msg_id = sms.msgID
         WHERE sms.sendDT BETWEEN '2020-11-25' AND '2020-11-25'
        ) a
;
-- 조인이 꼭 필요한 것인지도 의문입니다.
SELECT COUNT(*) cnt_total
     , COUNT(CASE WHEN sendResult  = 6 THEN 1 END) cnt_success
     , COUNT(CASE WHEN sendResult != 6 THEN 1 END) cnt_fail
  FROM (SELECT sendResult
          FROM oshotmms
         WHERE sendDT BETWEEN '2020-11-25' AND '2020-11-25'
         UNION ALL
        SELECT sendResult
          FROM oshotsms
         WHERE sendDT BETWEEN '2020-11-25' AND '2020-11-25'
        ) a
;

 


by 찡스쿄 [2020.11.25 16:24:06]

마농 선생님.. 정말 감사드립니다.

오늘도 커다란 것을 하나 배워가네요 ㅠㅠ..

GROUP BY만 생각하고 있었고,

카운트를 여러개 다른 조건으로 사용한다는 건 생각지도 못하고 있었습니다...

정말 감사드립니다...

 

조인은 MSG_MGMT 테이블에 매장 번호가 FK로 묶여있고,

추후에 매장명을 기준으로 검색할 수 있게 해달라는 요구가 있을지도 몰라서

조인하려고 했습니다!..

 

매번 도움만 받기도 죄송하고..

괜찮으시다면 dyl6266@nate.com으로 쪽지 하나만 주시겠어요?

감사한 마음에서 커피 한잔 선물해 드리고 싶습니다..

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