首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在row1 by row,row2 by row3....。.and存储输出的第三列

在row1 by row,row2 by row3....。.and存储输出的第三列
EN

Stack Overflow用户
提问于 2015-07-11 13:07:39
回答 1查看 576关注 0票数 3

我有了这个表,现在我需要对金额列进行除法运算,并在CalcAmt中更新数据

代码语言:javascript
复制
month  amt   CalcAmt
JAN   10000  NULL
FEB   20000  NULL
MAR   30000  NULL
APR   40000  NULL

例如:( Feb /JAN)然后将输出存储在FEB的CalcAmt中,( MAR /FEB)然后将输出存储在MAR的CalcAmt中,

预期输出:

代码语言:javascript
复制
month  amt   CalcAmt
JAN   10000  0
FEB   20000  2
MAR   30000  1.5
APR   40000  1.33
EN

回答 1

Stack Overflow用户

发布于 2015-07-11 13:17:42

这可以通过LEAD/LAG轻松完成,因为您正在使用Sql Server 2008,所以不能使用LEAD/LAG函数。相反,使用可以为每一行生成行号,并使用行号+1自连接相同的表,以获取前一行数据。

注意:如果有,您需要将剩余的months添加到order in case语句中。

另外,您不应该使用作为对象名称ex: MONTH

代码语言:javascript
复制
;WITH cte 
     AS (SELECT Rn=CASE [month] 
                     WHEN 'Jan' THEN 1 
                     WHEN 'feb' THEN 2 
                     WHEN 'mar' THEN 3 
                     ELSE 4 
                   END, 
                * 
         FROM   YOURTABLE) 
SELECT A.month, 
       A.amt, 
       CalcAmt = A.amt / NULLIF(b.amt ,0)
FROM   cte A 
       LEFT OUTER JOIN cte B 
                    ON A.rn = b.rn + 1 

如果你想要更新表,那么使用这个。

代码语言:javascript
复制
;WITH cte 
     AS (SELECT Rn=CASE [month] 
                     WHEN 'Jan' THEN 1 
                     WHEN 'feb' THEN 2 
                     WHEN 'mar' THEN 3 
                     ELSE 4 
                   END, 
                * 
         FROM   YOURTABLE) 
UPDATE C 
SET    C.calcamt = D.calcamt 
FROM   cte C 
       INNER JOIN (SELECT A.month, 
                          A.amt, 
                          calcamt=A.amt / b.amt 
                   FROM   cte A 
                          LEFT OUTER JOIN cte B 
                                       ON A.rn = b.rn + 1) D 
               ON C.[month] = D.[month] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31353648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档