更新并使用sum计算列值

时间:2015-05-22 13:26:04

标签: sql sql-server sql-update

我正在使用sql-server。我有一张表,其中包含公司列表的价值。我希望将每个公司的百分比作为此列表的一部分。见下面的例子

name   value    wgt%
abc    10
plm    15
xyz    25

以上是我所拥有的,下面是我想要的,

name   value    wgt%
abc    10       20
plm    15       30
xyz    25       50

我尝试过类似的事情:

update D_COMP_VALUES
set wgt = value / sum(value)   

5 个答案:

答案 0 :(得分:3)

使用子选项获得总和:

update D_COMP_VALUES
set wgt = 100 * value / (select sum(value) from D_COMP_VALUES)

但是存储计算值通常是个坏主意。相反,创建一个视图,永远不会有不一致的数据!

答案 1 :(得分:1)

我会使用窗口函数来解决这个问题:

with toupdate as
      select cv.*, sum(value) over () as sumvalue
      from d_comp_values
     )
update toupdate
    set wgt = value / sumvalue;

请注意,SQL Server会执行整数除法,因此如果value是整数(如示例数据所示),除非转换为其他数字表示形式,否则可能会为零:

set wgt = value * 1.0 / sumvalue;

答案 2 :(得分:1)

更新连接似乎按顺序:

UPDATE     d
SET        wgt = value * 100.0 / sumvalue 
FROM       d_comp_values d
CROSS JOIN (SELECT SUM(value) AS sumvalue FROM d_comp_values) agg

答案 3 :(得分:1)

您可以进行简单的更新:

UPDATE D_COMP_VALUES
SET wgt = value * 100 / (SELECT SUM(value) FROM D_COMP_VALUES)

SQL Fiddle Demo

答案 4 :(得分:0)

我会将实施留给您,但这就是我的方式。

  1. 为总和创建变量。
  2. 从查询中计算总和并将其插入变量
  3. 更新基表设置wgt = value / variable
  4. 也就是说,将这些信息存储在表格中是一个坏主意,您应该计算它或使用视图。