2012-11-28 39 views
3

我花了很多时间来构建这个选择,但我无法解决它。我有两张桌子。第一个表称为汽车并具有PK(主键)id_car和另一列名称等。第二个表称为评级,并具有col_id_rating(PK),id_car(FK)和rating_value(整数)。正如你怀疑的那样,一辆车可以有一次以上的咆哮。我想选择所有的汽车,我想知道每辆车的平均评分。最后,我想通过这个平均desc来排序结果。我正在尝试这样的事情:SQL从其他表中选择平均值

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) 

但它不起作用。

回答

4

对于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 
+2

只是添加更多信息:如果您想要包括尚未评级的汽车,请使用LEFT JOIN。 –

+0

@ShantanuGupta +1表示:) – Kaf

+0

谢谢先生!奇迹般有效 – matlos

0
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 
1

这实现了聚合函数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将包括所有汽车在结果中甚至还没有被评级。

0
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