2015-05-22 30 views
2

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

你使用MySQL或SQL Server?它们不是同一件事。 –

+0

抱歉应该指定 - 我正在使用SQL服务器 – mHelpMe

+0

我会这样做的方式是将您需要的数据加载到临时表或表变量中,然后对temp/variable表连接到基表进行更新。 –

回答

3

使用子选择得到总和:

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

但是,存储计算值通常是一个坏主意。创建一个视图,而不会有不一致的数据!

+2

我会建议使用'100.0'来处理十进制值 –

+0

@ShantanuGupta,当然可以完成,但预期结果没有小数。 – jarlh

1

我会接近这个利用窗口函数:

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; 
0

我会将实施留给你,但这是我会这样做的方式。

  1. 为总和创建一个变量。
  2. 从查询计算总和,并将其插入变量
  3. 更新的基表设置WGT =价值/可变

也就是说,存储这些信息在表格中是一个坏主意,你应该计算它或使用视图。

1

更新联接似乎顺序:

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 
+0

不要忘记设置wgt * 100以获得百分比而不是小数点 –

+1

@JeremyC。很好的接收,谢谢 - 修正。 – Mureinik

1

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

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

SQL Fiddle Demo