SELECT A.*, (
SELECT IFNULL(SUM(mutation), 0)
FROM v_activities_per_year_month_account
WHERE account_id = A.account_id AND (year < A.year OR (year = A.year AND month < A.month))
) AS opening_balance, (
SELECT SUM(mutation)
FROM v_activities_per_year_month_account
WHERE account_id = A.account_id AND (year < A.year OR (year = A.year AND month <= A.month))
) AS closing_balance
FROM v_activities_per_year_month_account AS A
Monthly opening balance query
SELECT months.year, months.month, balance - SUM(mutation) as opening_balance
FROM (
SELECT YEAR(activities.activity_date) AS `year`
, MONTH(activities.activity_date) AS `month`
, (SELECT SUM(balance) FROM accounts) as `balance`
FROM activities
GROUP BY YEAR(activities.activity_date)
, MONTH(activities.activity_date)
) AS months
JOIN (
SELECT YEAR(activities.activity_date) AS `year`
, MONTH(activities.activity_date) AS `month`
, SUM(debit) AS `debit`
, SUM(credit) AS `credit`
, SUM(debit) - SUM(credit) AS `mutation`
FROM activities
GROUP BY YEAR(activities.activity_date)
, MONTH(activities.activity_date)) AS monthly ON monthly.year = months.year AND monthly.month >= months.month
GROUP BY months.year, months.month
ORDER BY months.year, months.month, monthly.year, monthly.month
Result
Accumulated query
SELECT MONTH(sales.created_at) AS sales_month
, COUNT(sales.id) AS sales_count
, (SELECT SUM(sales_count)
FROM (SELECT MONTH(sales.created_at) AS sales_month
, COUNT(*) AS sales_count
FROM sales
LEFT JOIN sale_items ON sale_items.sale_id = sales.id
GROUP BY MONTH(sales.created_at)) AS monthly_sales
WHERE sales_month <= MONTH(sales.created_at)) AS sales_count_accumulated
, SUM(quantity) AS sales_quantity
, (SELECT SUM(sales_quantity)
FROM (SELECT MONTH(sales.created_at) AS sales_month
, SUM(quantity) AS sales_quantity
FROM sales
LEFT JOIN sale_items ON sale_items.sale_id = sales.id
GROUP BY MONTH(sales.created_at)) AS monthly_sales
WHERE sales_month <= MONTH(sales.created_at)) AS sales_quantity_accumulated
, SUM(quantity * price) AS sales_turnover
, (SELECT SUM(sales_turnover)
FROM (SELECT MONTH(sales.created_at) AS sales_month
, SUM(quantity * price) AS sales_turnover
FROM sales
LEFT JOIN sale_items ON sale_items.sale_id = sales.id
GROUP BY MONTH(sales.created_at)) AS monthly_sales
WHERE sales_month <= MONTH(sales.created_at)) AS sales_turnover_accumulated
FROM sales
LEFT JOIN sale_items ON sale_items.sale_id = sales.id
GROUP BY MONTH(sales.created_at)
Monthly sales trend query
SELECT A.month
,A.count amount
,A.count - B.count amount_growth
,100 * (A.count - B.count) / A.count AS amount_growth_percent
,A.quantities sales_quantity
,A.quantities - B.quantities quantity_growth
,100 * (A.quantities - B.quantities) / A.quantities quantity_growth_percent
,A.total turnover
,A.total - B.total turnover_growth
,100 * (A.total - B.total) / A.total turnover_growth_percent
FROM (
SELECT MONTH(sales.created_at) month
,COUNT(sales.id) count
,SUM(quantity) quantities
,SUM(quantity * price) total
FROM sales
INNER JOIN sale_items ON sale_items.sale_id = sales.id
GROUP BY MONTH(sales.created_at)
) AS A
LEFT JOIN (
SELECT MONTH(sales.created_at) month
,COUNT(sales.id) count
,SUM(quantity) quantities
,SUM(quantity * price) total
FROM sales
INNER JOIN sale_items ON sale_items.sale_id = sales.id
GROUP BY MONTH(sales.created_at)
) AS B ON B.month = A.month - 1