【问题标题】:In sql divide row1 by row,row2 by row3.... . .and store the output third column在sql中,将row1除以row,row2除以row3.... .并存储输出第三列
【发布时间】:2015-09-29 23:06:53
【问题描述】:

我有这张表,现在我需要对 amt 列进行除法并更新数据 int CalcAmt

month  amt   CalcAmt
JAN   10000  NULL
FEB   20000  NULL
MAR   30000  NULL
APR   40000  NULL

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

预期输出:

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

【问题讨论】:

  • 你可以通过 id+1 加入表格本身(如果你有自动增量值)。而不是在这个语句的选择中添加 sth 来划分行 t.amt / t2.amt
  • 但这只是选择...
  • 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
  • 很好,很高兴它成功了 ;-)

标签: sql sql-server sql-server-2008


【解决方案1】:

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

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

作为旁注,您不应使用 reserved keywords 作为对象名称 ex: 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] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多