让我们说,我有产品和分数表。
Product
-------
id
name
Score
-----
id
ProductId
ScoreValue
我想获得AVERAGE分数最高的前十大产品,我如何获得平均值并在一个选择陈述中选择前十大产品?
这是我的选择意外行
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
答案 0 :(得分: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
答案 1 :(得分: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
。
答案 2 :(得分: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
相应地更改您的表名和行数。