SELECT ed.e_id, DATE_FORMAT(ed.date, '%M %Y') AS `month`, et.expense_name, SUM(ed.amount) AS `amount`
FROM expense_details ed
INNER JOIN expense_types et ON (et.id = ed.e_id)
WHERE (ed.date BETWEEN '2011-11-01' AND DATE_ADD('2011-11-01', INTERVAL 3 MONTH))
GROUP BY `month`, ed.e_id
WITH ROLLUP
Вы можете установить любой диапазон дат, конечно, возможно, даже один месяц, или вообще не указывать дату, чтобы получить полный отчет.
Он будет суммировать расходы для каждого типа со сводкой каждый месяц (у вас будет заполнено month
и ed.e_id
= NULL - таким образом вы узнаете, что это сумма за месяц), а затем на полный рабочий день (как month
, так и ed.e_id
). = NULL).
Вывод будет таким:
e_id month expense_name amount
1 December 2011 Insurance 500
3 December 2011 Rent 1000
NULL December 2011 Rent 1500
3 January 2012 Rent 1000
NULL January 2012 Rent 1000
4 November 2011 Electricity 10
NULL November 2011 Electricity 10
NULL NULL Electricity 2510
Конечно, вы должны игнорировать липкий expense_name
, когда видите e_id
= NULL
Некоторые могут предложить вам просто получить результаты и затем суммировать их с помощью PHP, но это приведет к снижению производительности для больших отчетов. Позвольте SQL делать то, что у него получается лучше всего (копать в подсчете данных, суммировать, что угодно), и позволить PHP делать то, что у него получается лучше всего (рендерить HTML).
Конечно, SQl вознаградит вас еще большей производительностью, если у вас правильно настроены внешние ключи (поэтому JOIN будет работать быстрее, чем просто выбрать из двух таблиц и добавить id=e_id
в предложении WHERE) и индексировать поле date
.