更新并使用 sum 来计算列值

update and using sum to calculate column value

我正在使用 sql-服务器。我有一个 table,其中包含公司列表的值。我希望锻炼每个公司的百分比作为此列表的一部分。请参阅下面的示例

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)   

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

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

请注意 SQL 服务器进行整数除法,因此如果 value 是一个整数(如您的样本数据所建议的那样),除非您转换为另一种数字表示形式,否则您可能会得到零:

set wgt = value * 1.0 / sumvalue;

用一个子select求总和:

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

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

我会把实现留给你,但我会这样做。

  1. 为总和创建一个变量。
  2. 根据查询计算总和并将其插入变量
  3. 更新基础 table 设置 wgt = value/variable

也就是说,将此信息存储在 table 中不是一个好主意,您应该计算它或使用视图。

更新加入似乎是有序的:

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

您可以做一个简单的更新:

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

SQL Fiddle Demo