sql - 我想使用 SQL Server 计算列内的百分比变化

标签 sql sql-server

如果这个问题已经在其他地方得到解决,请原谅我,我检查过但无法为我工作。我不太熟悉 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/

相关文章:

mysql - SQL:如何通过连接从不同的表中获取多行? (初学者的问题)

sql-server - 为什么要收缩 sql server 2005 数据库?

sql - 在 select 中添加 "-"而不是空格

sql-server - 带有记录数的 mvc 发布列表不起作用

sql-server - 微软Azure+SQL数据库

sql - 我如何在 PostgreSQL 中通过 OID 从表中选择?

SQL 如果在相似日期找不到数据,则获取最后日期

Java如何从用户输入到方法搜索SQL

sql - 为什么使用子查询调用UDF可以提高查询性能?

mysql - 根据报告中的页码排列数据