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

Requêtes PostgreSQL Discussion :

2 articles les plus vendus par distributeur


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut 2 articles les plus vendus par distributeur
    Bonjour

    J'ai une table vente(id_vente, id_distributeur, id_article, quantite), et je cherche récupérer les 2 articles les plus vendus pour chacun des distributeurs.

    J'ai tenté cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT nom_article, sport, nom, SUM(quantite) AS total 
    FROM vente 
    NATURAL JOIN sports 
    NATURAL JOIN distributeur 
    NATURAL JOIN article 
    GROUP BY id_distributeur, nom_article, sport, nom 
    ORDER BY nom, total DESC 
    LIMIT 2;
    Mais ça ne me renvoit pas du tout ce que je souhaite.

    Une petite idée ??

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Pouvons nous avoir plus de detail sur le contenu des tables et des jointures?
    Je ne suis pas sur qu'utiliser NATURAL JOIN est une bonne idée!

    Que vous renvoie cette requête?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'ai utilisé ce code pour créer les tables.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE TABLE sports(
    	id_sport SERIAL NOT NULL PRIMARY KEY,
    	sport VARCHAR(50) NOT NULL
    );
     
    CREATE TABLE article(
    	id_article SERIAL NOT NULL PRIMARY KEY,
    	id_sport INT NOT NULL,
    	nom_article VARCHAR(50) NOT NULL,
    	prix_mini INT NOT NULL CHECK(prix_mini > 0),
    	FOREIGN KEY(id_sport) REFERENCES sports
    );
     
    CREATE TABLE distributeur(
    	id_distributeur SERIAL NOT NULL PRIMARY KEY,
    	nom VARCHAR(100) NOT NULL,
    	departement INT NOT NULL,
    	adresse VARCHAR(100)
    );
     
    CREATE TABLE catalogue(
    	id_distributeur INT NOT NULL,
    	id_article INT NOT NULL,
    	prix_conseille INT NOT NULL,-- CHECK(prix_conseille >= article.prix_mini),
    	stock INT NOT NULL CHECK(stock >= 0),
    	FOREIGN KEY(id_distributeur) REFERENCES distributeur,
    	FOREIGN KEY(id_article) REFERENCES article,
    	PRIMARY KEY(id_distributeur, id_article)
    );
     
    CREATE TABLE vente(
    	id_vente SERIAL NOT NULL PRIMARY KEY,
    	id_distributeur INT NOT NULL,
    	id_article INT NOT NULL,
    	quantite INT CHECK(quantite >= 0),
    	FOREIGN KEY(id_distributeur) REFERENCES distributeur,
    	FOREIGN KEY(id_article) REFERENCES article
    );

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Essaye ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT A.nom_article,
    		SUM(V.quantite) AS qte
    FROM article A
    INNER JOIN vente V ON V.id_article = A.id_article
    GROUP BY A.nom_article
    ORDER BY qte DESC
    LIMIT 2

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Nope...
    Ça ne m'affiche toujours que 2 articles... Alors que je veux 2 articles pour chaque distributeur.

    Le résultat final doit être de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    nom_article   nom_distributeur  nombre_vente
    --------------  -------------------  -----------------
    raquette        sport plus            200
    ballon           sport plus            150
    ballon           plus sport            348
    vélo              plus sport           146
    ...
    Ah... et je bosse avec postgresql

  6. #6
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Je ne suis pas sur du tout mais il y a de l'idée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT TOP 2 D.nom, A.nom_article, SUM(V.quantite)
    FROM article A
    INNER JOIN vente V ON V.id_article = A.id_article
    INNER JOIN distributeur D ON D.id_distributeur = V.id_distributeur
    GROUP BY D.nom, A.nom_article
    ORDER BY SUM(V.quantite) DESC

  7. #7
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Sinon, j'ai eu un problème similaire il y a pas longtemp sauf que je voulais qu'une seul ligne au lieu de 2 donc c'etait un peu plus simple:
    http://www.developpez.net/forums/d10...-ligne-groupe/

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par David55 Voir le message
    Je ne suis pas sur du tout mais il y a de l'idée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT TOP 2 D.nom, A.nom_article, SUM(V.quantite)
    FROM article A
    INNER JOIN vente V ON V.id_article = A.id_article
    INNER JOIN distributeur D ON D.id_distributeur = V.id_distributeur
    GROUP BY D.nom, A.nom_article
    ORDER BY SUM(V.quantite) DESC
    TOP n'existe pas sur postgresql...

  9. #9
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808

  10. #10
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Regarde par ici:
    http://cedric-duprez.developpez.com/...fier-group-by/


    Peut être ce code mais ceci m'étonnerai!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT D.nom, A.nom_article, SUM(V.quantite)
    FROM article A
    INNER JOIN vente V ON V.id_article = A.id_article
    INNER JOIN distributeur D ON D.id_distributeur = V.id_distributeur
    GROUP BY D.nom, A.nom_article
    ORDER BY SUM(V.quantite) DESC
    HAVING COUNT(D.id) = 2

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    En effet, ça ne marche pas...

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Le LIMIT me poussait à croire que tu étais sur MySql, je ne savais pas que PG utilisait aussi LIMIT.
    Mais c'est plutôt mieux que tu sois sur PG, j'espère que c'est une version suffisament récente, en effet j'ai lu récemment qu'ils avaiant finalement implémenter les fonctions de fenêtrage, ce qui facilite tout de même grandemant la vie

    Donc normalement row_number devrait faire l'affaire :
    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
    select 
        t2.id_distributeur
      , t2.id_article
      , t2.nb
    from (
        select 
    	t1.id_distributeur
          , t1.id_article
          , t1.nb
          , row_number() over (partition by t1.id_distributeur order by t1.nb desc) as rn
        from (
          select id_distributeur, id_article, sum (quantite) as nb
          from vente
          group by id_distributeur, id_article
        ) t1
    ) t2
    where t2.rn <= 2
    order by t2.id_distributeur, t2.nb desc
    Si c'est bon je te laisse faire la jointure pour récupérer les noms à la place des id, si row_number n'est pas accepté dans ta version, il faudra se galérer un peu plus.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci! Ça fonctionne!

  14. #14
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Merci skuatamad c'est bon à savoir

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/05/2015, 16h26
  2. Réponses: 7
    Dernier message: 20/05/2009, 13h40
  3. Réponses: 6
    Dernier message: 04/11/2007, 22h15
  4. [Spip] Tableau non affiché dans la partie "Articles les plus récents"
    Par Gigi95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 27/09/2007, 12h27
  5. Les articles les plus vendus
    Par sam01 dans le forum Langage SQL
    Réponses: 21
    Dernier message: 19/01/2007, 14h17

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