2013-12-09 30 views
0

將從算術列SQL表達式我有一個表:上另外兩列

_________________________________ 
| Student | Competitions | Wins | 
_________________________________ 
| Johnny |  8  | 4 | 
| Michael |  9  | 4 | 
| Ariel |  5  | 3 | 
| Raphael |  5  | 1 | 

我想創建一個新表,增加了包含每一個學生的勝率新列。像這樣:

__________________________________________ 
| Student | Competitions | Wins | Win Pct | 
__________________________________________ 
| Johnny |  8  | 4 | .5 | 
| Michael |  9  | 4 | .44 | 
| Ariel |  5  | 3 | .6 | 
| Raphael |  5  | 1 | .2 | 

有沒有辦法做到這一點 - 即通過將一列中的值除以另一列中的值來創建新列?

+0

你嘗試寫查詢分割兩列?你使用的是哪個數據庫? – Taryn

+0

Wny不只是創建一個視圖,如果這個值總是計算? – OldProgrammer

回答

2

怎麼樣只是你的SELECT子句中添加一個表達式爲另一個領域,就像這樣:

SELECT Student, Competitions, Wins, Wins/Competitions 
FROM tablename 
+0

這比添加列好得多。您不應該存儲計算的值。 – woz

+0

酷 - 我沒有意識到它是那麼簡單! – CodyBugstein

+0

我不接受答案,因爲我發現問題的答案 - 新列中的結果只有零個或一個。我認爲這可能與需要指定它成爲一個浮動有關...我該怎麼做?你能更新你的答案嗎? – CodyBugstein

0

從概念上講,你在做什麼是壞的。數據庫應該存儲基本信息 - 這裏是數據,如學生,競賽和勝利。另一方面,勝率可以根據其他數據改變。它來源於比賽和勝利,所以每次需要時都應該計算。當然,對於特別複雜的派生列,性能方面的考慮因素,但這不應該是你的情況。

對於一個粗略的比喻,想想爲什麼當你已經有他們的出生日期時,將用戶的年齡存儲在數據庫中是一個糟糕的設計決定。

+0

這就是爲什麼我想要一個查詢,這將允許我重新計算它,只要我想要 – CodyBugstein

+0

然後看到上面的SamShin的答案。你可以在每次需要時很簡單地計算出它,而不是將它保存在一張桌子上,等待陳舊。 – mgw854

0

我會同意其他答案,這是一個糟糕的設計實踐,因爲您正在存儲基本的計算數據。

這是said..this查詢應該爲你做它(假設你已經創建了列)

update tablename set WinPct = (coalesce(Wins,0)/Competitions) where Competitions IS NOT NULL

這應該乾淨利落地支持空值(NULL比賽=>空WinPct) 。

每次Wins或Comps被更新時,您都必須設置觸發器(或使用應用程序邏輯)來重新填充此字段,但我會跳過該部分。這是爲什麼存儲這是一個壞主意的另一個原因。

0

mti2935是正確的,唯一的變化是增加 '* 1.0' 這將int轉換成浮動

SELECT學生,比賽,勝,勝率* 1.0 /比賽 FROM表名