【问题标题】:SQL select for average from another tableSQL 从另一个表中选择平均值
【发布时间】:2012-11-16 06:11:22
【问题描述】:

我花了很多时间来构建这个选择,但我无法解决它。我有 2 张桌子。第一个表称为 car 并具有 PK(主键)id_car 和另一个列名称等。第二个表称为 rating 并具有列 id_rating (PK)、id_car (FK) 和 rating_value (integer)。正如您所怀疑的那样,一辆车可以有不止一个咆哮。我想选择所有汽车,我想知道每辆车的平均评分。最后,我想按这个平均降序对结果进行排序。我正在尝试这样的事情:

    SELECT id_car, name, average
    FROM car C, rating R 
    WHERE C.id_car = R.id_car 
    ORDER BY (average) (
        SELECT AVG(rating_value) AS average 
        FROM rating R
        WHERE C.id_car = R.id_car)

但它不起作用。

【问题讨论】:

    标签: sql select average


    【解决方案1】:

    对于SQL Server;另外我建议你使用JOIN 而不是WHERE table1, table2..

    SELECT C.id_car, name, AVG(rating_value) AS average
    FROM car C JOIN rating R 
          ON C.id_car = R.id_car
    GROUP By C.id_car, name
    ORDER BY average DESC
    

    【讨论】:

    • 只是为了添加更多信息:如果您想包括那些尚未评级的汽车,请使用 LEFT JOIN。
    • @ShantanuGupta +1 :)
    【解决方案2】:
    SELECT C.name, AVG(R.rating_value)
    FROM car C, rating R 
    WHERE C.id_car = R.id_car
    GROUP BY C.name
    ORDER BY AVG(R.rating_value) DESC
    

    【讨论】:

      【解决方案3】:

      这实现了聚合函数 AVG()GROUP BY 的汽车 ID 和名称:

      select c.id_car, c.name, avg(r.rating_value) aver
      from car c
      left join rating r
        on c.id_car = r.id_car
      group by c.id_car, c.name
      order by aver desc
      

      使用LEFT JOIN 将在结果中包含所有汽车,甚至包括尚未评级的汽车。

      【讨论】:

        【解决方案4】:
         SELECT c.id_car, c.name,avg(r.rating_value) as rating   
        FROM car c
         join  rating r 
         on c.id_car = r.id_car   
        group by r.id_car 
        order by rating
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-05
          • 1970-01-01
          • 2013-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-04
          • 2014-12-10
          相关资源
          最近更新 更多