Mysql根据季度计算增长

标签 mysql laravel

我有一个包含两个表的数据库 - companiesreports。我想计算从 q1(第 1 季度)到 q2(第 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

这是 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;

预期结果(这就是我需要的):

+---------+----------+----------------+----------+--------------+-----------+------------------+
|  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               |
+---------+----------+----------------+----------+--------------+-----------+------------------+

非常感谢您帮助构建此查询。提前致谢。

最佳答案

使用 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 

db<>fiddle demo

关于Mysql根据季度计算增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53025787/

相关文章:

php - 在将安装在许多随机主机上的 PHP 软件中使用 MySQL 触发器是否安全

php - Laravel 5.7 Email Verification 如何翻译?

javascript - 从验证重新加载页面后,带有 Select2 的 Laravel 输入值不会持续存在

php - 如何将图像添加到 Laravel 5.3 的新通知服务生成的电子邮件中?

mysql 使用 date_sub 按日期匹配

javascript - ER_NOT_SUPPORTED_AUTH_MODE - MySQL 服务器

javascript - AJAX 更改页面内容不能多次工作?

php - Laravel 5 Excel 安装失败

mysql - 服务器返回无效时区。转到“高级”选项卡并手动设置 servertimezone 属性

java - 有 2 个结果集循环的 Servlet