如果这个问题已经在其他地方得到解决,请原谅我,我检查过但无法为我工作。我不太熟悉 SQL Server。
我想使用 SQL Server 计算表中 01、02、03... 表示的 1 月到 12 月之间的索引百分比。我已使用 Excel 添加了 Pct_Change 列中预期的内容。请参阅下面的示例:
M Year Indices Pct_Change
01 2017 190.51
02 2017 188.99 -0.8
03 2017 190.06 0.6
04 2017 194.24 2.2
05 2017 196.83 1.3
06 2017 196.30 -0.3
07 2017 191.09 -2.7
08 2017 190.42 -0.3
09 2017 194.02 1.9
10 2017 201.20 3.7
11 2017 200.98 -0.1
12 2017 194.43 -3.3
01 2018 197.23 1.4
02 2018 198.20 0.5
03 2018 194.60 -1.8
任何帮助将不胜感激。
最佳答案
由于缺乏预期结果,这是一个猜测,但也许......
WITH VTE AS(
SELECT *
FROM (VALUES(01,2017,190.51),
(02,2017,188.99),
(03,2017,190.06),
(04,2017,194.24),
(05,2017,196.83),
(06,2017,196.30),
(07,2017,191.09),
(08,2017,190.42),
(09,2017,194.02),
(10,2017,201.20),
(11,2017,200.98),
(12,2017,194.43),
(01,2018,197.23),
(02,2018,198.20),
(03,2018,194.60)) V(M, [Year], Indices))
SELECT *,
(Indices / LAG(Indices) OVER (ORDER BY [Year] ASC, M ASC)) -1 AS Pct_change
FROM VTE;
编辑:不幸的是,OP 使用的是 2008R2。就我个人而言,我强烈建议您升级您的版本。 SQL Server 2008(R2) 的扩展支持现在还剩下不到一年的时间。此后,您将不会收到任何更新,包括安全更新。如果您需要遵守 GDPR,那么您必须进行更改。
无论如何,您可以在 SQL Server 2008R2 中通过对同一个表使用 LEFT JOIN
来执行此操作:
WITH VTE AS(
SELECT *
FROM (VALUES(01,2017,190.51),
(02,2017,188.99),
(03,2017,190.06),
(04,2017,194.24),
(05,2017,196.83),
(06,2017,196.30),
(07,2017,191.09),
(08,2017,190.42),
(09,2017,194.02),
(10,2017,201.20),
(11,2017,200.98),
(12,2017,194.43),
(01,2018,197.23),
(02,2018,198.20),
(03,2018,194.60)) V(M, [Year], Indices)),
--The solution. note that you would need your WITH on the next line
--Mine isn't, as I used a CTE to create the sample data.
RNs AS(
SELECT *,
ROW_NUMBER() OVER (ORDER BY [Year] ASC, M ASC) AS RN
FROM VTE)
SELECT R1.M,
R1.[Year],
R1.Indices,,
(R1.Indices / R2.Indices) -1 AS Pct_change
FROM RNs R1
LEFT JOIN RNs R2 ON R1.RN = R2.RN + 1;
关于sql - 我想使用 SQL Server 计算列内的百分比变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51261890/