1

我正在尝试用 SQL 编写一个函数,输出一个球队在一个赛季的棒球比赛中的胜率。

CREATE FUNCTION
calc_winning_percentage(IN w integer, IN l integer, OUT p numeric)
RETURNS numeric AS $$
    SELECT $1 ::numeric/$1 + $2 AS p;
$$ LANGUAGE SQL;

这是当前功能。它应该很简单。W = 胜利。L = 损失。P = 百分比。你取胜 (w) 并除以胜 + 负 (w + l)。理论上,这给出了胜率。

我拿了一些已经提供的数据并尝试将其插入。它很接近,但它不正确。假设我们有一支 96 胜 63 负的球队。如果你把这两个数字加起来,你会得到 159. 96/159 = ~.604。但是,当我通过查询运行这些数字时,我得到 64.0000。

我不擅长用其他语言编写函数(我保证),所以我在这里做错了什么?

4

1 回答 1

2

运算符优先级

CREATE OR REPLACE FUNCTION calc_winning_percentage(
     w integer
    ,l integer
    ,OUT p numeric)
  RETURNS numeric AS
$func$
    SELECT $1::numeric / ($1 + $2)
$func$ LANGUAGE SQL;

你需要括号($1 + $2)

圆形的

您可以将其构建到您的函数中:

CREATE OR REPLACE FUNCTION calc_winning_percentage_rd3(
  w integer, 
  l integer,
  OUT p numeric)
RETURNS numeric AS
$func$
SELECT round($1::numeric/($1 + $2), 3)
$func$ LANGUAGE SQL;

或者您可以round()像这样从上面申请该功能:

SELECT round(calc_winning_percentage(1000, 29), 3);

-> SQLfiddle 演示

请注意,round()有两个参数需要numeric作为第一个输入。

于 2013-03-17T21:23:32.523 回答