【问题标题】:Calculate YTD and Prior YTD for any given month using SQL使用 SQL 计算任何给定月份的 YTD 和先前 YTD
【发布时间】:2018-06-29 20:16:57
【问题描述】:

我正在尝试构建一个图表,显示我有数据的任何给定月份的当前 YTD 和之前 YTD 的收入,通过 SQL 生成,可以随时从视图中检索到报告中。

表格看起来像这样

USER1 | MONTH | YEAR | REVENUE | YTD REVENUE | PRIOR YTD REVENUE |
------------------------------------------------------------------
Dan   | Feb   | 2016 |  $75    |   $75       |                   
Bob   | Feb   | 2016 |         |             |                   
Chris | Feb   | 2016 |  $220   |   $220      |     
Dan   | Jan   | 2017 |  $100   |   $100      |     
Bob   | Jan   | 2017 |  $150   |   $150      |     
Chris | Jan   | 2017 |  $200   |   $200      |     
Dan   | Feb   | 2017 |  $100   |   $200      |     $75
Bob   | Feb   | 2017 |  $100   |   $250      |     
Chris | Feb   | 2017 |  $125   |   $225      |     $220

作为构建所述视图的一部分,如何按月通过 sql 计算当前 YTD 和之前的 YTD?我目前没有按照上面的示例按月/年计算 YTD,因此在计算 PYTD 的同时还需要将其包含在语句中。

目前的SQL查询是

Select USER1, MONTH(Date), YEAR(Date), REVENUE from SOURCE 

【问题讨论】:

  • 之前是上个月(例如LAG() OVER())还是总数(例如SUM() OVER())?
  • 为什么 Chris - Feb - 2017 YTD REVENUE 是 225?

标签: sql sql-server tsql


【解决方案1】:

您将使用窗口函数。这将假设“月”实际上是一个月数列。这比仅仅一个月更有意义:

select t.*,
       lag(ytd) over (partition by user1, month order by year) as prev_ytd
from (select t.*,
             sum(revenue) over (partition by user1, year order by month) as ytd
      from t
     ) t;

这假设所有用户都有相关月份的数据。

编辑:

如果您缺少行:

with tc as (
      select t.*,
             sum(revenue) over (partition by user1, year order by month) as ytd
      from t
     )
select tc.*, tcprev.ytd
from tc outer apply
     (select top (1) tcprev.ytd
      from tc tcprev
      where tcprev.user1 = tc.user1 and
            tcprev.year = tc.year and
            tcprev.month <= tc.month
      order by tcprev desc
     ) tcprev;

【讨论】:

  • 如果他们不这样做会发生什么?有几个月会出现这种情况
  • @Danimov82 。 . .然后需要更复杂的代码。您的样本数据包含所有月份所有名称的完整数据,因此这似乎是一个合理的假设。
  • 是的,样本数据确实有完整的列,但实际数据没有。我可以修改样本,谢谢
  • 获取 tcprev 的“无效列名”,但看不到错误所在。表本身是 t(或者在我的情况下是 SalesActivity),在那里很好,但不清楚为什么我会在上面的公式中遇到这个错误。
  • 同样在运行 select t.*, sum(revenue) over (partition by user1, year order by month) as ytd from t 出来的金额和给定列的金额一样月/年与累计年初至今
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
相关资源
最近更新 更多