簡體   English   中英

SQL,如何不計算0值

[英]SQL , how not to count 0 values

我正在嘗試使用此代碼進行總投票,我有12條條件; 因此,將每個SHOP_ID的TOTAL加起來,然后除以12(用於總計的列數)。 COUNT(shop_id)查找商店的數量,因此,例如,如果我有2個shop_id輸入,一個輸入總計為0(12個條目為0),另一個總計60,該數量除以12個條件,然后除以shop_id計數的2(60/12)/ 2 = 2.5我希望結果為5。有些方法不計算除法中的0。

$sel = mysql_query("SELECT SUM(comfort + service + ambience + mood + spacious + 

    experience + cleanliness+ price + drinks + food + music + toilets)/(12/COUNT(shop_id) as total                  
    FROM ratings         
    WHERE shop_id = $shop_id");                 

if(mysql_num_rows($sel) > 0){
    while($data = mysql_fetch_assoc($sel)){
        $total = $total + $data['total']; 
        $rows++;
    }
    $perc = ($total/$rows);
    return round($perc,2);
} else {
    return '0';
}

如果我提供圖像以視覺方式顯示要實現的效果會更好嗎?

每行不是1票,每個shop_id是12票。 每個列類別名稱:舒適性+服務+環境,是列ID,並且該字段中的條目為1票,它將12計為1票,如果您對1個條件投票,則其他11則為0,並返回錯誤結果,除以2將得到正確答案的一半

我已經上傳了一個直觀的示例,出於測試目的,將評分列從12縮短為7。 表示例

嘗試使用HAVING子句:

select
...
from
...
where
...
having COUNT(shop_id) > 0
SELECT SUM(comfort + service + ambience + mood + spacious + 
experience + cleanliness+ price + drinks + food + music + toilets)/(12/COUNT(shop_id) as total                  
FROM ratings         
WHERE shop_id = $shop_id
HAVING total > 0

我很確定您的查詢不太正確,但這可能是一個錯字。

這可能是一個更好的查詢:

SELECT shop_id, SUM(comfort + service + ambience + mood + spacious + 
experience + cleanliness+ price + drinks + food + music + toilets)/12 as total_rating                 
FROM ratings         
GROUP BY shop_id
HAVING total > 0

就個人而言,我認為如果有人的總得分為0,那是值得注意的,但是以上所述應該可以為您提供每家商店的平均評分,並過濾掉不低於1的所有評分。

如果每個類別的評分范圍是0-5,並且有12個類別,則表示它們的百分比得分是(各個得分的總和)/(可能的總分)* 100,或者在這種情況下,是單個分數/.6(計算方法相同)。 如果您想要一個“星級評定”,其中星級數量等於每個類別的最高得分,那只是平均值。 在這種情況下,我將四舍五入為小數點后一位。 因此,如果您想走那條路線,這是我要使用的查詢:

   SELECT shop_id, 
          Ceiling(
                 Sum(comfort + service + ambience + mood + spacious + 
                      experience + cleanliness + price + 
                      drinks + food + music + toilets
           ) /. 6) 
          AS  percent_rating, 
          ROUND(
            SUM(
              comfort + service + ambience + mood + 
              spacious + experience + cleanliness + 
              price + drinks + food + music + toilets
            )/12, 1)
          as star_rating
   FROM   ratings 
   GROUP  BY shop_id 

現在,如果您希望將每個分數都超出100%的位置進行布局,則應為(cat_score / 5)* 100或(cat_score / .05)。 我不確定是否有一種簡便的方法可以應用於所有類別,而不必顯式地對每個字段進行數學運算,但實際上我認為您不必費心找出4 / 5是80%。

至於針對默認0與有意0的處理方式,您無法知道其區別。 如果某人感覺不到移動到足以將其從0(或空白)更改的程度,那么它一定不是那么了不起。 最好的選擇是將默認值設置為中間值(3),如果實際情況很糟糕,默認值為0,大多數人會將此值標記為較低。類似地,如果您將其保留為空白(不為0,它為NULL),那么您可以將其移至3(效果相同。如果他們都將其留為空白,這與說“所以平均而言我沒有填寫”)相同,也可以將其設為一個數字認為是公平的(可能是1或2),將其扔掉是一個痛苦的mysql,並且在統計信息中會導致誤導性數據(認為將chad與語言障礙相結合,因此將它們留為空白)。最后,將空白移到中間會很好的,因為說了算,您應該有足夠的數據來獲取標准偏差和其他更有價值的統計信息,而不是依賴於簡單的平均數(在這里,一些糟糕的評論可能會拖垮整個曲線)。

添加到查詢的末尾:

HAVING comfort + service + ambience + mood + spacious + experience + cleanliness+ price + drinks + food + music + toilets != 0

您的查詢不太正確。 它缺少括號。

正確的一個:

$sel = mysql_query("SELECT SUM(comfort + service + ambience + mood + spacious +  
experience + cleanliness+ price + drinks + food + music +toilets)/(12/COUNT(shop_id)) 
as total FROM ratings WHERE shop_id = $shop_id having COUNT(shop_id) > 0");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM