Sql 更新并使用sum计算列值
我正在使用sql server。我有一个表,其中包含一个公司列表的值。我希望计算每个公司的百分比,作为此列表的一部分。见下面的例子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
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)
但是存储计算值通常是个坏主意。相反,创建一个视图,它永远不会有不一致的数据 我将把实现留给您,但我会这样做
也就是说,将此信息存储在表中是一个坏主意,您应该计算它或使用视图。更新连接似乎按顺序进行:
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以获得百分比而不是小数