3

我对以下需要使用 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 中,在此先感谢

4

2 回答 2

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用于为每个月创建适当的序数。

于 2013-01-31T08:12:27.437 回答
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

还有小提琴

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

于 2013-01-31T08:17:22.670 回答