与前几个月(累计)构建表

时间:2013-01-31 07:56:33

标签: sql sql-server-2008

我有点迷失了以下需要用SQL查询解决的问题,没有plsql。我们的想法是建立一个累积列来计算前几个月。输入表看起来像

 Month
 1
 2
 3
 ..
 24

我需要构建下表:

Month Cum_Month
1     1
2     1
2     2
3     1
3     2
3     3
..
24    1
...
24    23

所有这些都在SQL Server 2008中,提前谢谢

2 个答案:

答案 0 :(得分:2)

你可以这样做:

DECLARE @tbl TABLE ([Month] INT)
INSERT @tbl VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24)


SELECT  Month
        ,   ROW_NUMBER() OVER (PARTITION BY Month ORDER BY Month) num
FROM    @tbl a
JOIN    
(
    SELECT  *
    FROM    master..spt_values 
    WHERE   type = 'P'
)
b ON b.number < a.Month

master..spt_values用于生成数字,生成数字后,子查询的结果将连接到@tbl以获取与month对应的行数。之后ROW_NUMBER用于为每个月创建适当的序号。

答案 1 :(得分:1)

这是一个非常酷的技巧,不使用任何表格:

SELECT N.Number as Month, N2.Number as Cum_Month
FROM 
   (SELECT Number FROM master..spt_values WHERE Number BETWEEN 1 AND 24 AND Type = 'P') N
   JOIN (SELECT Number FROM master..spt_values WHERE Number BETWEEN 1 AND 24 AND Type = 'P') N2 ON N.Number >= N2.Number
ORDER BY N.Number, N2.Number

Fiddle

如果你真的不想要最后24 24(为什么不),只需将第二个查询更改为1到23之间。