EXPLAIN SELECT
extract(year from dd.Calendar_Date) AS period,
dd.Calendar_Date,
IFNULL(stats_contribution.amount,0) AS amount_contribution,
IFNULL(stats_contribution.individuals,0) AS individuals_contribution,
IFNULL(stats_contribution.average_contribution,0) AS average_contribution,
IFNULL(stats_spendings.amount,0) AS amount_spendings,
IFNULL(stats_spendings.individuals,0) AS individuals_spendings
FROM
`Dim_Date` dd
LEFT JOIN (
SELECT
extract(year from created_time) AS period,
SUM(amount) as amount,
COUNT(*) as individuals,
ROUND(SUM(IF(type = 116, ABS(amount), 0 )))/COUNT(transaction_id) AS 'average_contribution'
FROM
`transactions`
WHERE
type IN (116) AND
DATE(created_time) BETWEEN SUBDATE(CURDATE(), INTERVAL 1575 DAY) AND CURDATE() AND
DATE(created_time)>='2020-12-22'
GROUP BY
extract(year from created_time)
) stats_contribution ON (stats_contribution.period = extract(year from dd.Calendar_Date))
LEFT JOIN (
SELECT
extract(year from created_time) AS period,
SUM(amount) as amount,
COUNT(*) as individuals
FROM
`transactions`
WHERE
type IN (112) AND
DATE(created_time) BETWEEN SUBDATE(CURDATE(), INTERVAL 1575 DAY) AND CURDATE() AND
DATE(created_time)>='2020-12-22'
GROUP BY
extract(year from created_time)
) stats_spendings ON (stats_spendings.period = extract(year from dd.Calendar_Date))
WHERE
dd.Calendar_Date BETWEEN SUBDATE(CURDATE(), INTERVAL 1575 DAY) AND CURDATE() AND
DATE(dd.Calendar_Date)>='2020-12-22'
GROUP BY
extract(year from dd.Calendar_Date)
ORDER BY
dd.Calendar_Date ASC