如果乘以ZERO,MYSQL避免SELECT计算

时间:2014-08-31 19:39:39

标签: mysql sql select

我正在从MYSQL表中做一个SELECT

表格如下

year    tour      starts    scoring_avg
1990     EUR        5         71.56
1990     USA        6          0.0
1991     EUR        12        71.21
1991     USA        8         69.23

我正在做一个SELECT

SELECT 
  year,
  SUM(starts),
  SUM(starts*scoring_avg) as scoring.avg
FROM scores
GROUP BY year

目标是获得年度综合得分平均值,并结合每年的欧元和美国行数。

在SELECT之后,我将scoring_avg除以开始。由于我从第二行开始添加了6,因为该行没有scoring_avg,结果不正确。

1991年罚款。 由于美国行的scoring_avg为0,因此1990年没有工作。

是否有一种方法可以将SELECT修改为仅使用SUM中的ps.starts * ps.scoring_avg,其中该行中的ps.scoring_avg大于0?

谢谢。

- Ed

3 个答案:

答案 0 :(得分:2)

如果您只想更改scoringavg,请使用条件聚合:

SELECT year, SUM(starts),
       SUM(case when scoring_avg > 0 then starts*scoring_avg end) as scoring_avg
FROM scores
GROUP BY year;

但是,我建议在一个查询中完成所有工作,之后不做任何分工。以下计算您想要的平均值:

SELECT year, SUM(starts),
       (SUM(case when scoring_avg > 0 then starts*scoring_avg end) /
        SUM(scoring_avg > 0)
       ) as scoring_avg
FROM scores
GROUP BY year;

答案 1 :(得分:1)

你可以试试这个:

SELECT 
  year,
  SUM(starts),
  SUM(starts*scoring_avg) as scoring.avg
FROM scores
WHERE scoring_avg > 0
GROUP BY year

答案 2 :(得分:1)

您可以根据starts列中的值,使用有条件地返回0列中的值或scoring_avg(或NULL)的表达式。举个例子:

IF(scoring_avg=0,0,starts)

也就是说,如果scoring_avg的值为零(对于特定行),则返回零;否则,返回starts列中的值。这是MySQL特定的语法,相当于ANSI标准的CASE表达式:

CASE scoring_avg WHEN 0 THEN 0 ELSE starts END 

在查询的上下文中:

SELECT s.year
     , SUM( IF(s.scoring_avg=0,0,s.starts) ) AS `starts`
     , SUM( s.starts*s.scoring_avg )         AS `scoring.avg`
     , SUM( s.starts*s.scoring_avg ) / 
       SUM( IF(s.scoring_avg=0,0,s.starts) ) AS `scoring.avg_div_starts`
  FROM scores s
 GROUP BY s.year