我正在使用sql-server。我有一张包含公司名单价值的表格。我希望将每家公司的%作为此列表的一部分。见下面的例子更新和使用sum来计算列值
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)
我正在使用sql-server。我有一张包含公司名单价值的表格。我希望将每家公司的%作为此列表的一部分。见下面的例子更新和使用sum来计算列值
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)
使用子选择得到总和:
update D_COMP_VALUES
set wgt = 100 * value/(select sum(value) from D_COMP_VALUES)
但是,存储计算值通常是一个坏主意。创建一个视图,而不会有不一致的数据!
我会建议使用'100.0'来处理十进制值 –
@ShantanuGupta,当然可以完成,但预期结果没有小数。 – jarlh
我会接近这个利用窗口函数:
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
SET wgt = value * 100.0/sumvalue
FROM d_comp_values d
CROSS JOIN (SELECT SUM(value) AS sumvalue FROM d_comp_values) agg
不要忘记设置wgt * 100以获得百分比而不是小数点 –
@JeremyC。很好的接收,谢谢 - 修正。 – Mureinik
你可以做一个简单的更新:
UPDATE D_COMP_VALUES
SET wgt = value * 100/(SELECT SUM(value) FROM D_COMP_VALUES)
你使用MySQL或SQL Server?它们不是同一件事。 –
抱歉应该指定 - 我正在使用SQL服务器 – mHelpMe
我会这样做的方式是将您需要的数据加载到临时表或表变量中,然后对temp/variable表连接到基表进行更新。 –