【问题标题】:calculate average of rows when average row is bigger than a certain number with mysql当平均行大于使用mysql的某个数字时计算行的平均值
【发布时间】:2015-06-26 17:20:05
【问题描述】:

我有一个计算行平均值的查询。单行的平均值由非空值/空值组成。这行得通。 我现在想要的是仅在其平均值大于某个数字时才计算该行。现在它正在使用所有行。 我怎样才能完成这项工作?

id | p_cijfer | b_cijfer | c_cijfer | c_id
----------------------------------------------
1  | 4        | 4        |    0     |   3   average = 4
----------------------------------------------
2  | 8        | 6        |    6     |   3   average = 6.7
----------------------------------------------
3  | 10       | 6        |    8     |   3   average = 8
----------------------------------------------
1  | 4        | 4        |    0     |   1   average = 4
----------------------------------------------

现在我只想计算平均值高于 6 的行的平均值。这将导致只计算记录 2 和 3。 输出必须是 id 的 2 和 3 的平均值,平均值 = (6.7+8)/2=7.5

select 

AVG(((reviews.prijs_cijfer+
 reviews.planning_cijfer+
 reviews.betrouwbaarheid_cijfer +
 reviews.communicatie_cijfer +
 reviews.kennis_cijfer +
 reviews.innovatie_cijfer
) /
nullif(
  case when prijs_cijfer=0 then 0 else 1 end +
  case when planning_cijfer=0 then 0 else 1 end +
  case when betrouwbaarheid_cijfer=0 then 0 else 1 end +
  case when communicatie_cijfer=0 then 0 else 1 end +
  case when kennis_cijfer=0 then 0 else 1 end +
  case when innovatie_cijfer=0 then 0 else 1 end , 0)))
from reviews

【问题讨论】:

  • 不确定您需要什么。您能否提供示例数据(两列就足够了)和所需的结果。

标签: mysql select average


【解决方案1】:

您可以使用子查询来应用过滤器。

select c_id, avg(rows.rowavg) filteredavg, count(rows.rowavg) affecting
from (
    select
        c_id c_id,
        ((reviews.prijs_cijfer+
        reviews.planning_cijfer+
        reviews.betrouwbaarheid_cijfer +
        reviews.communicatie_cijfer +
        reviews.kennis_cijfer +
        reviews.innovatie_cijfer
        ) /
        nullif(
        case when prijs_cijfer=0 then 0 else 1 end +
        case when planning_cijfer=0 then 0 else 1 end +
        case when betrouwbaarheid_cijfer=0 then 0 else 1 end +
        case when communicatie_cijfer=0 then 0 else 1 end +
        case when kennis_cijfer=0 then 0 else 1 end +
        case when innovatie_cijfer=0 then 0 else 1 end , 0)) rowavg
    from reviews
) rows
where rows.rowavg > 6
group by c_id

【讨论】:

  • 谢谢,但是当我运行查询时说:'每个派生表都必须有自己的别名,
  • 好极了,我还有一个问题。如果我想要 c_id = 3 AND c_id = 1 怎么办
  • 在子查询中添加 where 子句:... from reviews where c_id in ('1', '3') ...
  • 我的意思是我想要c_id=3和c_id=1的结果,这样我就有2个结果。如果我使用 ... from reviews where c_id in ('1', '3') ... 它只会给出 1 个结果,
  • 影响行:使用count(rows.rowavg)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多