2017-02-02 12 views
-1

неделях у меня есть таблица вроде этого: enter image description hereКак результаты группы MySQL в

Мне нужно просуммировать, сколько сообщений были доставлены в MSISDN в последних 8 недель (но для каждой недели) с даты введенных. Вот что я придумал:

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

И когда я добавляю в msisdnGROUP BY статье я не получить результат, как мне нужно это.

И мне это нужно так:

enter image description here

Пожалуйста, помогите мне написать оптимизированный запрос для извлечения этих результатов для каждого MSISDN за последние 8 недель, потому что я застрял.

+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(...) имеет проблемы с первым в этом году. Вместо этого, вы можете использовать TO_DAYS:

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

Это довольно просто, но есть ошибка в нем. Он работает только в том случае, если сегодня последний день недели. И если дата% 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)) можно укоротить до SUM(delivered = 1) или даже SUM(delivered), если эта колонка имеет только 0 или 1 значение.

Смежные вопросы