首页 > 解决方案 > SQL 获得同比季度至今的收入

问题描述

有下表:

Year    Quarter Month   Revenue
2005      Q1    1          13
2006      Q1    1          10
2006      Q1    2          15
2006      Q1    3          35
2006      Q2    4          11
2006      Q2    5          15
2006      Q2    6          9
2007      Q1    1          6
2007      Q1    2          14
2007      Q1    3          7
2007      Q2    4          20
2007      Q2    5          6
2007      Q2    6          6

我需要一个查询来计算季度至今收入的同比比较,如下所示:

Year    Quarter Month   CUrrentQTDRevenue    PreviousQTDRevenue
2005        Q1    1           13                     
2006        Q1    1           10                    13
2006        Q1    2           25                    13
2006        Q1    3           60                    13
2006        Q2    4           11     
2006        Q2    5           26     
2006        Q2    6           35     
2007        Q1    1            6                    10
2007        Q1    2           20                    25
2007        Q1    3           27                    60
2007        Q2    4           20                    11
2007        Q2    5           26                    26
2007        Q2    6           32                    35

我已经设法获得了本年度季度至今的收入

SELECT Year, Quarter, Month
        , SUM(Revenue) OVER (PARTITION BY Year, Quarter ORDER BY Year, Quarter, Month)
           AS CurrentYearQuarterToDateRevenue
FROM revenue

但我如何进入第二部分?请注意,我不能简单地加入季度和月份,因为例如,2005 年第一季度只有一个月,所以 2006 年第一季度每个月都有 13 个月。

标签: sqlsql-server

解决方案


在示例中,上一年的收入不一致地应用。如果 YQM 收入在 2007 年与 2006 年以及 2006 年与 2005 年按季度累计,则 13 的值将结转至第一季度的第 2 个月和第 3 个月。像这样的东西

with yqm_ytd_cte(Year, Quarter, Month, YQM_YTD_Revenue) as (
    select Year, Quarter, Month,
        sum(Revenue) over (partition by Year, Quarter order by Year, Quarter, Month)
    from revenue)
select yy.*, isnull(yy_lag.YQM_YTD_Revenue, 0) as Prior_Year_YQM_YTD_Revenue
from yqm_ytd_cte yy
     left join yqm_ytd_cte yy_lag on yy.Year=yy_lag.Year-1
                                     and yy.Quarter=yy_lag.Quarter
                                     and yy.Month=yy_lag.Month;

推荐阅读