Создайте временную таблицу в вашей базе данных mysql со столбцами (month
, amount
), заполните ее рядом операторов вставки (есть куча; я доберусь до них в минуты), а затем составьте отчет по этой таблице.
Это немного более необычно, поэтому я собираюсь изложить это более подробно. Я делаю некоторые предположения относительно структуры таблицы SQL, но стараюсь сделать ее как можно более общей.
Итак, сначала вам понадобится временная таблица, и мы сначала заполним ее ежемесячным доходом на основе текущей даты due_on
:
CREATE TEMPORARY TABLE FutureRevenueReport
SELECT
CONCAT(YEAR(s.due_on), '-', MONTH(s.due_on)) as revenue_month,
s.due_amount as revenue_amount
FROM subscriptions s WHERE s.active = 'True';
Теперь в том же сеансе mysql выполните эту серию операторов вставки, чтобы заполнить будущий доход:
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 1 MONTH), '-',
MONTH(s.due_on + INTERVAL 1 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 2 MONTH), '-',
MONTH(s.due_on + INTERVAL 2 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), '-',
MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
-- etc, up to + INTERVAL 11 MONTH
-- Now the quarterly:
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), '-',
MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = 'True' AND s.term = 'QUARTERLY';
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 6 MONTH), '-',
MONTH(s.due_on + INTERVAL 6 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = 'True' AND s.term = 'QUARTERLY';
-- And the same for 9 months
-- Then do the same thing for SEMI-ANNUALLY and + INTERVAL 6 MONTH
-- And now the report:
SELECT revenue_month, sum(revenue_amount) as revenue from FutureRevenueReport
GROUP BY revenue_month;