示例架构: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")
答案 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
确定。我不知道那个逻辑应该做什么。