更新并使用 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)
但是存储计算值通常不是一个好主意。相反,创建一个永远不会有不一致数据的视图!
我会把实现留给你,但我会这样做。
- 为总和创建一个变量。
- 根据查询计算总和并将其插入变量
- 更新基础 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-服务器。我有一个 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)
但是存储计算值通常不是一个好主意。相反,创建一个永远不会有不一致数据的视图!
我会把实现留给你,但我会这样做。
- 为总和创建一个变量。
- 根据查询计算总和并将其插入变量
- 更新基础 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)