【问题标题】:SQL average for fields with 0具有 0 的字段的 SQL 平均值
【发布时间】:2012-10-01 21:53:08
【问题描述】:

我有一个带有一些评分的 SQL 查询,例如

location, cleanliness, money, kitchen, checkinprocess, servicebyowner

对于少数数据checkinprocessservicebyowner0。我只想计算这些值的平均值。

我想检查我的查询,例如,如果结果有 20 行,则必须仅针对现有行计算 checkinprocessserviceby owner 的平均值(如果仅针对 10 行结果中的 2 行)它必须仅计算 2 行的平均值,但对于其他行,它可以根据行数计算。这是我写的查询:

  select count(customdata) as CNT,
         customdata,
         sum(service_by_owner) as ser,
         sum(checkinprocess) as chk,
         sum(locationrating) as loc,
         sum(cleanlinessrating) as cle,
         sum(valueformoneyrating) as val,
         sum(kitchenequipmentrating) as kit
    from feedback
group by customdata HAVING customdata !='null' AND customdata!=''; 

我能够计算其余四个的平均值 基于行的字段,但是对于这两个字段来说有点棘手 我。

编辑:

用于计算平均值的PHP:

foreach($result as $row){
  $arrValues[] = array("customdata"=>$row['customdata'],
                       "checkinprocess"=>ceil(($row['chk'])),
                       "service_by_owner"=>(ceil($row['ser'])),
                       "valueformoneyrating"=>ceil(($row['val']/($row['CNT']*4))*100), 
                       "locationrating"=>ceil(($row['loc']/($row['CNT']*4))*100),
                       "kitchenequipmentrating"=>ceil(($row['kit']/($row['CNT']*4))*100), 
                       "cleanlinessrating"=>ceil(($row['cle']/($row['CNT']*4))*100));
}

这个 checkinprocess 和 servicebyowner,我必须只计算现有行的平均值,而不是所有为 0 的行。

【问题讨论】:

  • 您的查询仅汇总列。没有计算平均值。您尝试过什么来解决您的问题?
  • 我正在尝试在 PHP 中找到平均值
  • 我已经添加了你的代码。不需要添加两次。
  • 如果您不想在计算中存储 0 个评分,为什么要存储它们?没有信息的值应该预先存储为空。零值应该有意义,因此是平均值的一部分。

标签: php sql


【解决方案1】:

有点猜测。 . .但您似乎想要不为 0 的值的平均值。您可以使用 SQL avg 函数来做到这一点:

select count(customdata) as CNT,
       customdata,
       avg(case when service_by_owner <> 0 then service_by_owner*1.0 end)*4*100.0 as ser,
       avg(case when checkinprocess<> 0 then checkinprocess*1.0 end)*4*100.0  as chk,
       avg(case when locationrating<> 0 then locationrating*1.0 end)*4*100.0  as loc,
       avg(case when cleanlinessrating<> 0 then cleanlinessrating*1.0 end)*4*100.0  as cle,
       avg(case when valueformoneyrating<> 0 then valueformoneyrating*1.0 end)*4*100.0  as val,
       avg(case when kitchenequipmentrating<> 0 then kitchenequipmentrating*1.0 end)*4*100.0  as kit
from feedback
WHERE customdata <> 'null' AND customdata <> ''; 
group by customdata

[乘以4*100是基于cmets。]

您没有提及您使用的是哪个 SQL 引擎,因此我将所有值转换为浮点数(乘以 1.0),因此平均值始终为浮点数。并非所有数据库都需要这样做。

我还将HAVING 子句更改为WHERE 子句。这在某种程度上是一个偏好问题,但我认为这是过滤输入而不是输出。另外,您是指customdata &lt;&gt; 'null' 还是customdata is not null

【讨论】:

  • 嗨,谢谢你,但我想根据返回计数(customdata)作为 CNT 的行数计算我的平均值,所以 [sum(locationrating)/CNT *4]*100..跨度>
  • @Indira 如果它不能解决您的问题,您为什么要接受这个答案?
  • @Indira 。 . .您可以取 SQL 中计算的平均值并乘以 4*100.0。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多