0

次のような評価のSQLクエリがあります

location, cleanliness, money, kitchen, checkinprocess, servicebyowner

少数のデータについてはcheckinprocessservicebyownerです0。値の平均を計算したいだけです。

結果として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!=''; 

行に基づいて残りの 4 つのフィールドの平均を計算することはできますが、この 2 つのフィールドについては、私には少し注意が必要です。

編集:

平均の計算に使用される 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 であるすべての行ではなく、既存の行の平均のみを計算する必要があります。

4

1 に答える 1

0

推測のビット。. . しかし、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 の乗算はコメントに基づいています。]

使用している SQL エンジンについて言及していないため、すべての値を浮動小数点数に変換したため (1.0 を掛けて)、平均は常に浮動小数点数になります。これは、すべてのデータベースで必要なわけではありません。

HAVINGまた、句を句に変更しましたWHERE。これは好みの問題ですが、私はこれを出力ではなく入力をフィルター処理していると考えています。また、またはということですcustomdata <> 'null'customdata is not null

于 2012-10-01T13:37:57.300 に答える