2017-02-02 2 views
-1

에서 그룹 MySQL의 결과로이 같은 테이블이 어떻게 : enter image description here

내가 입력 한 날짜로부터 지난 팔주 (그러나 각 주에 대한)에 MSISDN 당 전달 얼마나 많은 메시지 요약 할 필요가 있습니다. 여기에 내가 무엇을 최대 온 것입니다 :

SELECT count(*) as ukupan_broj, SUM(IF (sent_messages.delivered = 1,1,0)) as broj_dostavljenih, 
count(*) - SUM(IF (sent_messages.delivered = 1,1,0)) as non_billed, 
SUM(IF (sent_messages.delivered = 1,1,0))/count(*) as ratio, 
`sent_messages`.`msisdn`, 
MONTH(`sent_messages`.`datetime`) AS MONTH, WEEK(`sent_messages`.`datetime`) AS WEEK, 
DATE_FORMAT(`sent_messages`.`datetime`, '%Y-%m-%d') AS DATE 
FROM `sent_messages` 
INNER JOIN `received_messages` on `received_messages`.`uniqueid`=`sent_messages`.`originalID` 
and `received_messages`.`msisdn`=`sent_messages`.`msisdn` 
WHERE `sent_messages`.`datetime` >= '2016-12-12' 
AND `sent_messages`.`originalID` = `received_messages`.`uniqueid` 
AND `sent_messages`.`datetime` <= '2017-12-30' 
AND `sent_messages`.`datetime` >= `received_messages`.`datetime` 
AND `sent_messages`.`datetime` <= (`received_messages`.`datetime` + INTERVAL 2 HOUR) 
AND `sent_messages`.`type` = 'PAID' 
GROUP BY WEEK 
ORDER BY DATE ASC 

내가 WEEK하여 그룹화하고 있습니다 때문에, 나의 결과는 아니지만 MSISDN 당 모든 배달, 배달되지 않은 등의 합계를 보이고있다. enter image description here

내가 GROUP BY 절에 msisdn를 추가 할 때 나는 결과를 내가 그것을 필요로하는 방법을하지 않는다 : 결과가 어떻게 보이는지 여기에있다.

와 나는 이런 식으로 필요합니다

enter image description here

날 지난 팔주 당 각 MSISDN 이러한 결과를 가져 오기 위해 최적화 된 쿼리를 작성 도와주세요, 내가 붙어 있기 때문이다.

+0

참조 http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- SQL 쿼리 – Strawberry

답변

0

WEEK(...)에 올해 초반에 문제가 있습니다. 매우 간단

WHERE datetime > CURDATE() - INTERVAL 8 WEEK -- for the last 8 weeks 
GROUP BY MOD(TO_DAYS(datetime), 7) -- group by week 

,하지만 버그가 거기에있다 : 대신 TO_DAYS를 사용할 수 있습니다. 오늘이 "주"의 마지막 날인 경우에만 작동합니다. 그리고 날짜 % 7이 원하는 요일에 도착하면.

WHERE datetime > CURDATE() - INTERVAL 9 WEEK -- for the last 8 weeks 
GROUP BY MOD(TO_DAYS(datetime) - 3, 7) -- group by week 

버그 수정시 첫 번째 단절입니까? 9 주 간격에는 8 주전 현재 부분 주간과 부분 주간이 포함됩니다. "- 3"(또는 어떤 숫자의 작품이든) 월요일이나 일요일 등 무엇이든 시작할 수 있도록 "주간"을 정렬합니다.

SUM(IF (sent_messages.delivered = 1,1,0))은 0 또는 1 값만있는 경우 SUM(delivered = 1) 또는 SUM(delivered)까지 줄일 수 있습니다.