안녕하세요, 선배님들.
메시지 발송과 관련하여 쿼리 작성 중에 문제가 생겨 조언을 얻어보고자 글을 올립니다.
우선, 결과 화면은 첫 번째로 첨부한 이미지와 같습니다.
발송 결과(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 테이블입니다.)
-- 결과가 꼭 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 ;