Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL计算任意给定月份的年初至今和之前的年初至今_Sql_Sql Server_Tsql - Fatal编程技术网

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

我正试图构建一个图表,显示我拥有数据的任何给定月份当前和之前的年初至今的收入,通过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,因此需要将其与计算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开始按月按年订单得出的金额与给定列中月/年的金额与累计的年初至今金额相同