Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新并使用sum计算列值_Sql_Sql Server_Sql Update - Fatal编程技术网

Sql 更新并使用sum计算列值

Sql 更新并使用sum计算列值,sql,sql-server,sql-update,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 wg

我正在使用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)   

我将使用窗口函数来实现这一点:

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;

使用子选择获取总金额:

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

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

我将把实现留给您,但我会这样做

  • 为总和创建一个变量
  • 计算查询的总和并将其插入变量
  • 更新基表设置wgt=值/变量

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

    更新连接似乎按顺序进行:

    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)
    

    您使用的是MySQL还是SQL Server?它们不是同一件事。抱歉,我应该指定-我使用sql Server的方式是将所需的数据加载到临时表或表变量中,然后更新临时表/变量表与基表的联接。我建议使用
    100.0
    来处理十进制数value@ShantanuGupta,当然可以,但是预期的结果没有小数。不要忘记设置wgt*100以获得百分比而不是小数