使用varchar YearMonth从最新可用数据滚动12个月SUM

时间:2016-05-16 13:15:05

标签: sql sql-server-2008

示例架构:ID(varchar 4),YM(varchar 6),Rev(Float),P_K(ID,YM)

ID      YM      Rev
1001    201112  150
1001    201211  200
1001    201212  200
1001    201303  500
...     ...     ...
1001    201605  400
1023    201112  150
1023    201211  200
1023    201212  200
1023    201303  500
...     ...     ...
1023    201605  700

我需要在YM(年月)的12个月之前创建一个VIEW,其中每行应具有Rev(收入)的SUM。

我尝试过以下查询,但它会向后返回“201512”中的数据。我期待YM从'201603'开始,因为这是表中可用的最新YM数据。

 SELECT
    fs.ID,
    fs.YM,
    (SELECT SUM(fsi.Rev) FROM FSource fsi WHERE fsi.YM >= ((100* (fs.YM / 100) + 1)-100) AND fsi.YM <= fs.YM AND fsi.ID= fs.ID) AS Rev

FROM FSource fs
WHERE RIGHT(fs.ym, 2) = (SELECT COUNT(*) FROM FSource fsi WHERE fsi.YM >= ((100* (fs.ym / 100) + 1)-100) AND fsi.YM <= fs.ym AND fsi.ID= fs.ID)     

任何帮助,在这里可能有什么问题?

预期产出:

ID      YM      Rev
...     ...     ...
1001    201601  1500
1001    201602  2400
1001    201603  2400
1001    201604  6000
1001    201605  4800 (assuming last 12 months were 400 each, date range "201506 to 201605")

1 个答案:

答案 0 :(得分:2)

您可以使用相关子查询来处理此问题:

select fs.*,
       (select sum(fs2.rev)
        from fsource fs2
        where fs2.id = fs.id and
              cast(fs2.ym as int) <= cast(fs.ym as int) and
              cast(fs2.ym as int) > cast(fs.ym as int) - 100
       ) as rev_12months
from fsource fs;

您的查询存在的一个问题是此表达式((100* (fs.YM / 100) + 1)-100)。对于诸如201603之类的值,它将变为201501,因为SQL Server执行整数除法。此外,依靠隐式转换是一个坏主意。

返回的行由外部where确定。我不知道那个逻辑应该做什么。