使用SQL计算任意给定月份的年初至今和之前的年初至今
我正试图构建一个图表,显示我拥有数据的任何给定月份当前和之前的年初至今的收入,通过SQL生成,可以随时从视图检索到报表中 这张桌子看起来像这样使用SQL计算任意给定月份的年初至今和之前的年初至今,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正试图构建一个图表,显示我拥有数据的任何给定月份当前和之前的年初至今的收入,通过SQL生成,可以随时从视图检索到报表中 这张桌子看起来像这样 USER1 | MONTH | YEAR | REVENUE | YTD REVENUE | PRIOR YTD REVENUE | ------------------------------------------------------------------ Dan | Feb | 2016 | $75 | $75
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,因此需要将其与计算PYTD一起包含在报表中
当前SQL查询是
Select USER1, MONTH(Date), YEAR(Date), REVENUE from SOURCE
您将使用窗口函数。这将假设月份实际上是一个月数列。这比一个月更有意义:
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;
前一个月是前一个月(如滞后)还是总收入(如总和)超过?为什么克里斯-2月-2017年年初至今收入为225?如果没有,在这种情况下会发生什么?会有那么几个月,这是最重要的case@Danimov82 . . . 然后需要更复杂的代码。您的示例数据具有所有月份的所有名称的完整数据,因此这似乎是一个合理的假设。是的,示例数据确实具有完整的列,但实际数据没有。我可以修改示例,感谢您为tcprev获取了无效的列名,尽管没有看到错误所在。表本身是t,或者在我的例子中,SalesActivity很好,但不清楚为什么我会在上面的公式中出现错误。同样在运行select t.*时,user1在分区上计算sumrevenue,从t开始按月按年订单得出的金额与给定列中月/年的金额与累计的年初至今金额相同