Вы должны использовать группировку, чтобы сделать это для вас:
SELECT name, DATE(tdate) as d, SUM(amount)
FROM revenue
WHERE d >= NOW() AND d < DATE_ADD(NOW(), 30 DAYS)
GROUP BY name, d
Это даст вам каждую дату в новом ряду вместо нескольких полей в одном ряду, но мы надеемся, что это выполнимое решение для вас.
Я предположил, что tdate
это datetime
. ДАТА (tdate
) преобразует его в просто дату (исключая часть времени). Кроме того, замените предложение WHERE тем диапазоном, который вам необходим.
Редактировать : хорошо, поэтому нам нужно иметь одну строку на имя с таким количеством полей, сколько необходимо. Такая таблица называется «перекрестная таблица», и MySQL не очень хорошо ее поддерживает, но вы определенно можете взломать ее вместе. Смотрите здесь для получения дополнительной информации: http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html
Однако, если даты известны заранее, не составит труда использовать PHP, чтобы сложить все вместе.
// get this list in whichever way you wish
$dates = array("2009-09-09", "2009-09-10", "2009-09-11");
$sql = "SELECT name, "
. "sum(if (tdate='"
. implode("', amount, 0), sum(if (tdate='", $dates)
. "', amount, 0)"
. "FROM revenue "
. "GROUP BY name";