2013-04-25 72 views
4

可以說,我有產品和分數表。選擇平均分最高的前10名

Product 
------- 
id 
name 

Score 
----- 
id 
ProductId 
ScoreValue 

我想要得到的前10名產品具有最高的平均分數,我怎麼平均值,選擇排名前10位的產品在一個select語句?

這裏是我的,其選擇意外行

SELECT TOP 10 Product.ProductName Score.Score 
FROM Product, Score 
WHERE Product.ID IN (select top 100 productid 
         from score 
         group by productid 
         order by sum(score) desc) 
order by Score.Score desc 

回答

2

試試這個,

WITH records 
AS 
(
    SELECT a.ID, a.Name, AVG(b.ScoreValue) avg_score, 
      DENSE_RANK() OVER (ORDER BY AVG(b.ScoreValue) DESC) rn 
    FROM Product a 
      INNER JOIN Score b 
       ON a.ID = b.ProductID 
    GROUP BY a.ID, a.Name 
) 
SELECT ID, Name, Avg_Score 
FROM records 
WHERE rn <= 10 
ORDER BY avg_score DESC 

我爲什麼不使用TOP的原因是因爲它不會處理具有最高的平均重複記錄。但是您可以使用TOP WITH TIES代替。

+0

這是驚人的。我將其標記爲回答 – 2013-04-25 12:14:45

+0

高興它幫助。 – 2013-04-25 12:24:55

2

請嘗試:

declare @Product as table (id int, name nvarchar(20)) 
declare @Score as table (id int, ProductID int, ScoreValue decimal(23, 5)) 

insert into @Product values (1, 'a'), (2, 'b'), (3, 'c') 

insert into @Score values (1, 1, 25), (2, 1, 30), (3, 2, 40), (4, 2, 45), (5, 3, 3) 

select 
    distinct top 2 name, 
    ProductID, 
    AVG(ScoreValue) over (partition by name) 
from @Product a inner join @Score b on a.id=b.ProductID 
order by 3 desc 

變化與相應的表名和行數。

4

這可能做

SELECT TOP 10 p.ProductName, avg(s.Score) as avg_score 
FROM Product p 
    inner join Score s on s.product_id = p.product_id 
group by p.ProductName, p.product_id 
order by avg_score desc