我对以下需要使用 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 中,在此先感谢
我对以下需要使用 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 中,在此先感谢
你可以这样做:
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
用于为每个月创建适当的序数。
这是一个不使用任何表格的非常酷的技巧:
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 之间)。