SQL - WHERE Condition on SUM()

前端 未结 4 458
长发绾君心
长发绾君心 2020-12-19 18:12

Is it possible to do something like this:

SELECT 
  `e`.*, 
  `rt`.`review_id`, 
  (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
FROM `catalog_product_ent         


        
相关标签:
4条回答
  • 2020-12-19 18:42

    You need to use HAVING clause when filtering by aggregate functions:

    SELECT 
      # `e`.*, => is this needed
      `rt`.`review_id`, 
      (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
      AVG(vt.percent) AS rating1 # same as above 
    FROM `catalog_product_entity` AS `e` 
    INNER JOIN `rating_option_vote` AS `vt`
      ON vt.review_id = e.review_id 
    GROUP BY `vt`.`review_id`
    HAVING AVG(vt.percent) > 0
    

    Two other notes:

    1) SUM(x)/COUNT(x) <=> AVG(x)

    2) You are including e.* in select but not in group by. MySql lets you do it but other databases wont.

    0 讨论(0)
  • 2020-12-19 18:44

    You can use HAVING clause:

    SELECT 
      `e`.*, 
      `rt`.`review_id`, 
      (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
    FROM `catalog_product_entity` AS `e` 
    INNER JOIN `rating_option_vote` AS `vt`
      ON vt.review_id = e.review_id 
    GROUP BY `vt`.`review_id` 
    HAVING rating >= 0;
    

    As your question is tagged MySQL this solution should work, as the documentation shows:

    ...In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in the HAVING clause that are not named in the GROUP BY clause. A MySQL extension permits references to such columns to simplify calculations. ...

    This extension is enabled by default on official MySQL compilation.

    Reference: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html (on the first occurrence of the word HAVING on the page)

    0 讨论(0)
  • 2020-12-19 18:47

    This can be accomplished with a HAVING clause:

    SELECT e.*, rt.review_id, (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
    FROM catalog_product_entity AS e 
    INNER JOIN rating_option_vote AS vt ON e.review_id = vt.review_id 
    GROUP BY vt.review_id
    HAVING (SUM(vt.percent) / COUNT(vt.percent)) >= 0
    ORDER BY (SUM(vt.percent) / COUNT(vt.percent)) ASC
    

    Note: Added where to put ORDER BY statement

    The query optimizer should also not calculate the Average multiple times either, so that should not be a concern here.

    As was mentioned in @jagra's answer, you should be able to use AVG() instead of SUM() / COUNT()

    0 讨论(0)
  • 2020-12-19 18:57

    Use HAVING for aggregate conditions (such as the one you have)

    SELECT `e`.*, `rt`.`review_id`, (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
    FROM `catalog_product_entity` AS `e` 
    INNER JOIN `rating_option_vote` AS `vt`
        ON vt.review_id = e.review_id 
    WHERE ( rating >= '0') 
    GROUP BY `vt`.`review_id'
    HAVING (SUM(vt.percent) / COUNT(vt.percent)) > 0
    
    0 讨论(0)
提交回复
热议问题