4 votes

sélectionner les 10 premiers qui ont obtenu la meilleure note moyenne

Disons que j'ai des tableaux de produits et de scores.

Product
-------
id
name

Score
-----
id
ProductId
ScoreValue

Je souhaite obtenir les 10 premiers produits ayant les notes MOYENNES les plus élevées. Comment obtenir la moyenne et sélectionner les 10 premiers produits dans une seule déclaration de sélection ?

Voici le mien qui sélectionne des lignes inattendues

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

4voto

Omar Jackman Points 6632

Ceci pourrait faire l'affaire

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

2voto

John Woo Points 132738

Essayez ceci,

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

La raison pour laquelle je n'utilise pas TOP c'est parce qu'il ne traitera pas l'enregistrement en double ayant la moyenne la plus élevée. Mais vous pouvez utiliser TOP WITH TIES au lieu de cela.

2voto

TechDo Points 11224

Essayez, s'il vous plaît :

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

Modifiez le nom de votre table et le nombre de lignes en conséquence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X