首页 > 解决方案 > 使用 SQL 获取当前季度的季度环比增长

问题描述

我试图从数据集中仅获取当前季度的季度收入增长。我目前有一个看起来像这样的查询

Select
  x.Year,
  x.quarter,
  x.product,
  x.company_id,
  y.company,
  SUM(x.revenue)
FROM 
  company_directory y
  LEFT JOIN (
SELECT
  DATEPART(YEAR, @date) year,
  DATEPART(QUARTER, @date) quarter,
  product,
  SUM(revenue)
FROM sales
WHERE year => 2018 ) x
ON y.company_id = x.company_id

我得到的数据是这种格式

Year  Quarter  Product  company_id  company    revenue
2020  Q2       Banana   1092        companyX   $100

如果报告当前季度,我想要做的是获得季度收入增长。例如,在上面的数据中,因为我们处于 2020 年第二季度,我想要一个额外的列来说明 QoQ 是 x%,它将比较 Q2 和 Q1 的收入。如果该行报告 Q1-2020 或 Q2-2019 QoQ 将为空,因为这些都不是基于今天日期的当前季度。

预期结果

Year  Quarter  Product  company_id  company    revenue  QoQ
2020  Q2       Banana   1092        companyX   $100     20%
2020  Q1       Pear     1002        companyX   $23      NULL

我不完全确定该怎么做,没有太多的运气搜索。知道如何实施吗?

标签: sqldatejoingroup-by

解决方案


您可以使用窗口函数。

select
    s.yr,
    s.qt,
    s.product,
    s.company_id,
    cd.company,
    s.revenue,
    1.0 * (
        s.revenue 
        - lag(s.revenue) over(partition by s.product, s.company_id order by s.yr, s.qt)
    ) / lag(s.revenue) over(partition by s.product, s.company_id order by s.yr, s.qt) as QoQ
from company_directory cd
inner join (
    select
        datepart(year, sales_date) yr,
        datepart(quarter, sales_date) qt,
        product,
        company_id,
        sum(revenue) revenue
    from sales
    where sales_date >= '2018-01-01'
    group by 
        datepart(year, sales_date) year,
        datepart(quarter, sales_date) quarter,
        product,
        company_id
)  s on s.company_id = cd.company_id

笔记:

  • 您的代码不是有效的 MySQL;我假设您正在运行 SQL Server 而不是 MySQL

  • 在子查询中使用变量没有意义 - 我假设您在表中有一个名为的列sales_datesales其中包含销售日期

  • 您的group by条款与您的select条款不一致-我假设您希望每个公司和每个产品的季度销售增长

  • 您可能需要将QoQ计算调整为对季度增长的实际定义

  • 我看不出 a 的意义left join,所以我inner join改用


推荐阅读