Я предоставлю вам свой подход к этому, используя только одно объединение с группировкой по предложению и агрегатными функциями .Последний шаг вычисления pecentajes выполняется с использованием производной таблицы из первого подхода:
SELECT
der.name, der.quarter, der.fiscal_year,
der.revenue,
100 * der.revenue_change / der.revenue AS revenue_change,
der.taxes,
100 * der.taxes_change / der.taxes AS taxes_change,
der.employees,
der.employees_change
FROM
(
/* First approach (with raw changes) */
SELECT
c.name,
MAX(r.quarter) AS quarter,
ANY_VALUE(r.fiscal_year) AS fiscal_year,
SUM(CASE WHEN r.quarter = "Q2" THEN r.revenue END) AS revenue,
IF (COUNT(r.revenue) = 2,
SUM(CASE WHEN r.quarter = "Q1" THEN (-1 * r.revenue) ELSE r.revenue END),
NULL) AS revenue_change,
SUM(CASE WHEN r.quarter = "Q2" THEN r.taxes END) AS taxes,
IF (COUNT(r.taxes) = 2,
SUM(CASE WHEN r.quarter = "Q1" THEN (-1 * r.taxes) ELSE r.taxes END),
NULL) AS taxes_change,
SUM(CASE WHEN r.quarter = "Q2" THEN r.employees END) AS employees,
IF (COUNT(r.employees) = 2,
SUM(CASE WHEN r.quarter = "Q1" THEN (-1 * r.employees) ELSE r.employees END),
NULL) AS employees_change
FROM
companies AS c
LEFT JOIN
reports AS r ON r.company_id = c.id AND r.quarter IN ("Q1","Q2")
GROUP BY
c.id
) AS der
Вы можете проверить прогрессию к окончательному запросу по следующей ссылке:
https://www.db -fiddle.com / f / 2tUC1gGJusVnXSyGhHGWc / 3
Обобщение запроса
Я обобщил предыдущий запрос дляПодходя к сравнению кварталов из другого финансового года, как вы спросили в комментариях, вот как я это сделаю:
SET @q1Year = 2017;
SET @q2Year = 2018;
SET @q1 = "Q1" COLLATE utf8mb4_unicode_ci;
SET @q2 = "Q2" COLLATE utf8mb4_unicode_ci;
SELECT
der.name,
der.compared_quarters,
der.quarter,
der.fiscal_year,
der.revenue,
100 * der.revenue_change / der.revenue AS revenue_change,
der.taxes,
100 * der.taxes_change / der.taxes AS taxes_change,
der.employees,
der.employees_change
FROM
(
/* This query generate raw changes on revenue, taxes and employees */
SELECT
c.name,
CONCAT(@q1,"-",@q1Year," vs ",@q2,"-",@q2Year) AS compared_quarters,
@q2 AS quarter,
@q2Year AS fiscal_year,
SUM(IF(r.quarter = @q2, r.revenue, 0)) AS revenue,
IF (COUNT(r.revenue) = 2,
SUM(IF(r.quarter = @q1, -1 * r.revenue, r.revenue)),
NULL) AS revenue_change,
SUM(IF(r.quarter = @q2, r.taxes, 0)) AS taxes,
IF (COUNT(r.taxes) = 2,
SUM(IF(r.quarter = @q1, -1 * r.taxes, r.taxes)),
NULL) AS taxes_change,
SUM(IF(r.quarter = @q2, r.employees, 0)) AS employees,
IF (COUNT(r.employees) = 2,
SUM(IF(r.quarter = @q1, -1 * r.employees, r.employees)),
NULL) AS employees_change
FROM
companies AS c
LEFT JOIN
reports AS r ON r.company_id = c.id
AND
((r.quarter = @q1 AND r.fiscal_year = @q1Year) OR (r.quarter = @q2 AND r.fiscal_year = @q2Year))
GROUP BY
c.id
) AS der;
Вы можете проверить пример по следующей ссылке:
https://www.db -fiddle.com / ж / 2tUC1gGJusVnXSyGhHGWc / 4