2015-05-22 35 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