2013-08-07 4 views
1

Я пытаюсь получить среднесуточные значения в запросе ниже, за каждый день в течение 1 недели.Daily Average за 1 неделю

SELECT AVG(`Carbs`) As Carbs, AVG(`Sugar`) As Sugar, AVG(`Units`) As Units, 
DATE_FORMAT(`TrackedOn`, '%m/%d/%Y') As Date 
FROM `Tracking` 
WHERE `TrackedOn` BETWEEN ADDDATE(NOW(), INTERVAL -7 DAY) AND NOW() 

Однако это возвращает только меня 1 дней стоит в среднем (но я думаю, что в среднем все в том, что 1 неделю, и отображает только первый день)

Можете ли вы помочь мне достичь этого?

Вот некоторые фиктивные данные, со структурой таблицы:

-- 
-- Table structure for table `Tracking` 
-- 

DROP TABLE IF EXISTS `Tracking`; 
CREATE TABLE IF NOT EXISTS `Tracking` (
    `TrackID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `UserID` bigint(20) NOT NULL, 
    `TrackType` int(11) NOT NULL, 
    `Carbs` decimal(10,3) NOT NULL, 
    `Sugar` decimal(10,3) NOT NULL, 
    `Units` decimal(10,3) NOT NULL, 
    `TrackedOn` datetime NOT NULL, 
    `TrackLocation` geometry NOT NULL, 
    PRIMARY KEY (`TrackID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ; 

-- 
-- Dumping data for table `Tracking` 
-- 

INSERT INTO `Tracking` (`TrackID`, `UserID`, `TrackType`, `Carbs`, `Sugar`, `Units`, `TrackedOn`, `TrackLocation`) VALUES 
(1, 3, 1, 36.000, 217.000, 9.343, '2013-08-06 17:38:37', ''), 
(2, 3, 1, 36.000, 316.000, 12.171, '2013-08-06 17:40:23', ''), 
(3, 3, 4, 12.000, 316.000, 7.671, '2013-08-06 17:42:24', ''), 
(4, 3, 5, 0.000, 316.000, 6.171, '2013-08-06 18:01:53', ''), 
(5, 3, 5, 0.000, 317.000, 6.200, '2013-08-07 08:25:06', ''), 
(6, 3, 2, 89.000, 317.000, 21.033, '2013-08-07 08:25:13', ''), 
(7, 3, 5, 0.000, 317.000, 6.200, '2013-08-07 08:27:19', ''), 
(8, 3, 3, 82.000, 168.000, 12.193, '2013-08-07 08:27:31', ''), 
(9, 1, 3, 86.000, 217.000, 13.000, '2013-08-07 08:28:08', ''), 
(10, 3, 5, 0.000, 317.000, 6.200, '2013-08-07 09:13:39', ''); 

Моя цель состоит в том, чтобы вернуть среднесуточные из Carbs, Sugar, Units между Сегодня (NOW()) и 7 дней назад.

+3

Вы должны 'GROUP BY' день , Попробуйте добавить 'GROUP BY DATE_FORMAT (' TrackedOn', '% m /% d /% Y') 'в конец вашего запроса. –

+0

Да, у меня был последний момент, попробовал это до вашего комментария, и это сработало ... Мне нужно еще несколько фиктивных данных, прежде чем я смогу подтвердить, так что дайте мне немного. Опубликовать это как ответ, хотя нормально? – Kevin

+0

Подтверждено, работает как ожидалось. Спасибо Эд. Если вы просто опубликуете это в качестве ответа, я получу его принятым – Kevin

ответ

1

Просто добавьте GROUP BY DATE_FORMAT(TrackedOn, '%m/%d/%Y') до конца вашего запроса, и MySQL будет суммировать все днем:

SELECT AVG(`Carbs`) As Carbs, AVG(`Sugar`) As Sugar, AVG(`Units`) As Units, 
DATE_FORMAT(`TrackedOn`, '%m/%d/%Y') As Date 
FROM `Tracking` 
WHERE `TrackedOn` BETWEEN ADDDATE(NOW(), INTERVAL -7 DAY) AND NOW() 
GROUP BY DATE_FORMAT(TrackedOn, '%m/%d/%Y') 
0

Вы на правильном пути. Так как avg() является агрегированной функцией, он вычисляет значение и отображается как единое целое. Если вы хотите получить avg за каждый день. вам необходимо применить пункт group by. Посмотрите here.

Здесь вы можете попробовать, как:

SELECT AVG(`Carbs`) As Carbs, AVG(`Sugar`) As Sugar, AVG(`Units`) As Units, 
DATE_FORMAT(`TrackedOn`, '%m/%d/%Y') As Dates 
FROM `Tracking` 
WHERE `TrackedOn` BETWEEN ADDDATE(NOW(), INTERVAL -7 DAY) AND NOW() 
GROUP BY Dates; 
Смежные вопросы