SQL表达式,在其他两列上添加算术列

时间:2013-12-09 21:15:38

标签: sql postgresql

我有一张桌子:

_________________________________
| 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    |

有没有办法做到这一点 - 即通过将一列中的值除以另一列中的值来创建新列?

4 个答案:

答案 0 :(得分:2)

如何在SELECT子句中添加一个表达式作为另一个字段,如下所示:

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

答案 1 :(得分:0)

从概念上讲,你所做的事情很糟糕。数据库应存储基本信息 - 此处包括学生,比赛和胜利等数据。另一方面,胜利百分比可以根据其他数据而改变。它来自竞赛和胜利,所以应该在每次需要时计算。当然,对于特别复杂的派生列,性能考虑因素,但在您的情况下这不应该是一个问题。

对于一个粗略的比喻,考虑为什么在数据库中存储用户的年龄是一个糟糕的设计决定,当你已经有他们的出生日期。

答案 2 :(得分:0)

我将同意其他答案,这是一个糟糕的设计实践,因为你正在存储基本的计算数据。

那就是说..这个查询应该为你做(假设你已经创建了这个列)

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

这应该干净地支持空值(NULL竞争=> Null WinPct)。

每次更新Wins或Comps时,您必须设置触发器(或使用应用程序逻辑)来重新填充此字段,但我会跳过它的那一部分。这是存储这个是个坏主意的另一个原因。

答案 3 :(得分:0)

mti2935是对的,唯一的变化是添加'* 1.0'这会将int转换为float

选择学生,比赛,胜利,胜利* 1.0 /比赛 FROM tablename