我有一个包含两个表的数据库 - 公司和报告.我想计算从q1(第1季度)到第2季度(第2季度)的变化.我曾尝试使用(以下)子查询,但主查询失败...
FROM
(SELECT revenue FROM reports WHERE quarter = 'q2' AND fiscal_year = 2018) AS q,
(SELECT revenue FROM reports WHERE quarter = 'q1' AND fiscal_year = 2017) AS lq
Run Code Online (Sandbox Code Playgroud)
这里是DB Fiddle,可以帮助您理解问题和架构:
https://www.db-fiddle.com/f/eE8SNRojn45h7Rc1rPCEVN/4
当前简单查询.
SELECT
c.name, r.quarter, r.fiscal_year, r.revenue, r.taxes, r.employees
FROM
companies c
JOIN
reports r
ON
r.company_id = c.id
WHERE
c.is_marked = 1;
Run Code Online (Sandbox Code Playgroud)
预期结果(这是我需要的):
+---------+----------+----------------+----------+--------------+-----------+------------------+
| Name | Revenue | Revenue_change | Taxes | Taxes_change | Employees | Employees_change |
+---------+----------+----------------+----------+--------------+-----------+------------------+
| ABC INC | 11056 | +54.77 | 35000.86 | -28.57% | 568 | -32 |
| XYZ INC | 5000 | null | null | null | 10 | +5 |
+---------+----------+----------------+----------+--------------+-----------+------------------+
Run Code Online (Sandbox Code Playgroud)
我非常感谢您帮助构建此查询.提前致谢.
使用MySQL 8.0窗口函数:
WITH cte AS (
SELECT c.name, quarter, fiscal_year
,revenue,100*(revenue-LAG(revenue) OVER s)/NULLIF(revenue,0) AS change_revenue
,taxes,100*(taxes-LAG(taxes) OVER s)/NULLIF(taxes,0) AS change_taxes
,employees,employees-LAG(employees) OVER s AS change_employees
FROM companies c
JOIN reports r ON r.company_id = c.id
WINDOW s AS (PARTITION BY r.company_id ORDER BY fiscal_year, quarter)
)
SELECT *
FROM cte
WHERE quarter = 'Q2'; -- only to get specific quarter
-- comment this condition to get quarter to quarter comparison
Run Code Online (Sandbox Code Playgroud)
小智 2
使用纯 SQL 很难得到结果。但我做到了。
执行以下sql。我希望您能获得有关此 SQL 的帮助。
select
qd2.name as Name,
qd2.Revenue as Revenue,
qd2.Revenue - qd1.Revenue as Revenue_Change,
qd2.Taxes as Taxes,
(qd2.Taxes - qd1.Taxes) * 100 / qd1.Taxes as Taxes_Change,
qd2.Employees as Employees,
(qd2.Employees - qd1.Employees) as Employees_Change
from
(
SELECT
(@cnt := @cnt + 1) AS rowNumber,
c.name as name,
r.revenue as Revenue,
r.taxes as Taxes,
r.employees as Employees
FROM
companies c
JOIN
reports r
CROSS JOIN (SELECT @cnt := 0) AS dummy
ON
r.company_id = c.id and
r.quarter = "q2"
order by name
) as qd2
JOIN
(
SELECT
(@cnt2 := @cnt2 + 1) AS rowNumber,
c.name as name,
r.revenue as Revenue,
r.taxes as Taxes,
r.employees as Employees
FROM
companies c
JOIN
reports r
CROSS JOIN (SELECT @cnt2 := 0) AS dummy
ON
r.company_id = c.id and
r.quarter = "q1"
order by name
) as qd1
ON qd1.rowNumber = qd2.rowNumber
Run Code Online (Sandbox Code Playgroud)
结果如下
Name Revenue Taxes Employees Revenue_Change Taxes_Change Employees_Change
ABC INC 11056 35000.86 568 6056 -22.221798 -32
XYZ LLC 5000 null 10 null null 5
Run Code Online (Sandbox Code Playgroud)