我正在使用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表連接到基表進行更新。 –