Afficher les X premiers engistrements pour chaque clés composées

Résolu
Signaler
-
 MagicTaz -
Bonjour à tous,

Je parcours pas mal le forum pour des recherches particulières ou tout simplement pour fouiner un peu.
J'ai une question à laquelle je n'ai pas vue de réponse

J'ai une table stat de ventes, constituée de :
Periode
Ligne de produit
Classe de produit
Article
Qté Fact sur période
CA Fact sur période

Mon besoin est de listé le top Vente sur une période par clé (Ligne -Classe)

J'ai donc construit ma requête :

SELECT
Ligne, Classe, Article, Sum(Qte), Sum(CA)
FROM
MaTableStat
WHERE
Periode between PeriodeDebut AND PeriodeFIN
GROUP BY
Ligne, Classe, Article
ORDER BY
Ligne, Classe, Sum(Qte) Desc

Ce qui liste bien l'ensemble de mes couples (Ligne, Classe) trié sur Qté totale décroissante

Mon besoin est de lister les 10 meilleurs ventes par (Ligne, Classe)
Naïvement, j'ai essayer d'avoir mon top 10 des ventes en ajoutant TOP 10 en entête du select.
Naïvement, car cela ne récupère que les 10 premiers enreg ... Et c'est normal

Depuis, je cherche et je ne trouve pas de solution

Avez vous une idée ? Une piste à suivre ?

Merci

MagicTaz

2 réponses

Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
3
Un CROSS Apply pourrait répondre a tes besoins

SELECT Stats.Ligne, Stats.Classe, Stats.Article, Stats.QteTotal, Stats.CATotal
FROM (
SELECT DISTINCT MaTableStat.Ligne, MaTableStat.Classe
FROM MaTableStat
WHERE MaTableStat.Periode between PeriodeDebut AND PeriodeFIN
) AS LignesClasses
CROSS APPLY (
SELECT TOP (10) MaTableStat.Ligne, MaTableStat.Classe, MaTableStat.Article, Sum(MaTableStat.Qte) AS QteTotal, Sum(MaTableStat.CA) AS CATotal
FROM MaTableStat
WHERE MaTableStat.Periode between PeriodeDebut AND PeriodeFIN
AND MaTableStat.Ligne = LignesClasses.Ligne
AND MaTableStat.Classe = LignesClasses.Classe
GROUP BY MaTableStat.Ligne, MaTableStat.Classe, Article
ORDER BY MaTableStat.Ligne, MaTableStat.Classe, Sum(MaTableStat.Qte) Desc
) AS Stats
Merci Malkuth, c'est tout à fait ce dont j'avais besoin.

Entre temps j'ai éssayé plusieurs solutions à base de Left join et de UNION mais soit je n'avais pas le résultat escompté soit j'avais des temps de traitement allucinant

Cette solution est simple et en plus super rapide.

Merci - Merci