我正在从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
答案 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