Calculate opening and closing balance

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