在SQL中,将行1除以行2,行3除以行4......并将输出存储在第三列。

3
我有一个表格,现在我需要在amt列上执行除法并更新数据到CalcAmt中。
month  amt   CalcAmt
JAN   10000  NULL
FEB   20000  NULL
MAR   30000  NULL
APR   40000  NULL

例如:(二月/一月),然后将输出存储在二月的CalcAmt中,(三月/二月),然后将输出存储在三月的CalcAmt中。

预期输出:

month  amt   CalcAmt
JAN   10000  0
FEB   20000  2
MAR   30000  1.5
APR   40000  1.33

如果您有自动递增的值,可以通过id+1将表格与自身连接起来。然后在此语句的选择中添加一些内容,以便将行t.amt / t2.amt相除。 - Leo Gerber
但那只是选择... - Leo Gerber
`I tried this and its working : set @sr = (select top 1 Sr_No from #tempo order by #tempo.Sr_No desc); WHILE (@sr > 0) BEGIN if @sr > 1 begin set @Value = (select [Sales(INR)] from #tempo where Sr_No = @sr) set @value2 = (select [Sales(INR)] from #tempo where Sr_No = (@sr-1)) set @value3 = (select @Value/@value2) Update #tempo set Gropm = @Value3 where #tempo.Sr_No = @sr set @sr = @sr - 1; end else begin Update #tempo set Gropm = 0 where #tempo.Sr_No = 1 set @sr = @sr - 1; end` - Steph
不错,很高兴它起作用了;-) - Leo Gerber
1个回答

0

这可以通过LEAD/LAG轻松完成,但由于您使用的是Sql Server 2008,因此无法使用LEAD/LAG函数。相反,您可以为每一行生成行号,并自连接同一表格以获取前一行数据。

注意:如果有任何剩余的months,您需要在case语句中按顺序添加。

另外,请不要将保留关键字用作对象名称,例如:MONTH

;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 

如果您想要更新表格,请使用此方法。

;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] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接