IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Top n per group


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut Top n per group
    Bonjour,

    Y a-t-il un moyen sous SQL Server 2k de sélectionner les n premières lignes de chaque groupe ?

    Par exemple et pour parler plus concrètement, j'ai une table dans laquelle j'ai
    le champ personne
    le champ date_achat
    le champ cout_achat
    le champ categorie achat

    et ce que j'aimerais, c'est sortir pour chaque personne leur top 5 des catégories d'achat avec le total cout_achat associé

    tout ce qui me vient à l'esprit c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select personne, sum(cout_achat) as total_achat, categorie_achat
    from factures
    group by personne, categorie_achat
    order by sum(cout_achat) desc
    sauf que cela me sort tout et non pas le top 5 en fonction d'un group

    Si quelqu'un avait une idée...
    Merci d'avance !

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je me suis créé la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE maTable
    (
    	IDPersonne INT NOT NULL,
    	cout_achat NUMERIC(4,2) NOT NULL,
    	categorie_achat CHAR(1) NOT NULL
    )
    La requête devient alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT IDPersonne, categorie_achat, SUM(cout_achat)
    FROM maTable AS T0
    WHERE cout_achat <= (
    			SELECT MAX(T1.cout_achat)
    			FROM maTable AS T1
    			WHERE T0.IDPersonne = T1.IDPersonne
    			AND T0.cout_achat <= T1.cout_achat
    			HAVING COUNT(DISTINCT cout_achat) <= 5
    		)
    GROUP BY IDPersonne, categorie_achat
    Je ne suis pas parvenu à éviter la jointure triangulaire ...

    @++

  3. #3
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Une autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT 
    	t.personne,
    	t.categorie_achat,
    	t.total_achat
    FROM 
    (
    	SELECT 
    		personne,
    		categorie_achat,
    		SUM(cout_achat) AS total_achat	
    	FROM maTable t
    	GROUP BY personne, categorie_achat
    ) AS t
    INNER JOIN 
    (
    	SELECT 
    		personne,
    		categorie_achat,
    		SUM(cout_achat) AS total_achat	
    	FROM maTable t
    	GROUP BY personne, categorie_achat
    ) AS t2
    ON t.personne = t2.personne
     AND t.total_achat <= t2.total_achat
    GROUP BY t.personne, t.categorie_achat, t.total_achat
    HAVING COUNT(*) <=5;
    ++

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    wow, top, merci !
    j'étais parti dans des trucs compliqués avec du rank et tout, mais les performances étaient tellement lentes que je m'étais effectivement résigné à créer une table tampon

    merci pour votre aide à tous deux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008] TOP N OVER Group BY
    Par olibara dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 08/09/2013, 20h42
  2. Expert tri de groupe avec Top N par VB.net
    Par bonflor dans le forum Autres outils décisionnels
    Réponses: 0
    Dernier message: 27/07/2009, 19h42
  3. [CR XI] Tri de groupes - faire un top 5
    Par Johnny_boy_72 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 14/04/2009, 18h50
  4. Top Group By : Optimisation
    Par Baquardie dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/05/2008, 20h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo