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

Langage SQL Discussion :

[SQL SERVER] Afficher les enregistrements en fonction d'une colonne


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut [SQL SERVER] Afficher les enregistrements en fonction d'une colonne
    Bonjour à tous,

    J'ai une table contenant 3 champs :
    ID_ARTICLE, MAGASIN, PRIX

    Et des enregistrements. Par exemple :
    1, 'Auchan', 11
    1, 'Leclerc', 12
    2, 'Carrefour', 50
    3, 'Leclerc', 22
    3, 'Auchan', 23

    J'aimerai récupérer pour chaque article l'enregistrement le moins cher. Donc j'aimerai avoir :
    1, 'Auchan', 11
    2, 'Carrefour', 50
    3, 'Leclerc', 22

    J'ai regardé du coté de GROUP BY et HAVING mais je ne trouve pas mon bonheur. Si quelqu'un à une idée...

    Merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Il faut d'abord chercher pour chaque article quel est le prix le moins cher puis rappatrier le nom du magasin qui correspond à ce prix.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t.ID_ARTICLE, t.MAGASIN, t.PRIX
    FROM la_table AS t
    INNER JOIN (
      SELECT ID_ARTICLE, MIN(PRIX) AS prix_mini
      FROM la_table
      GROUP BY ID_ARTICLE
    ) AS tmp ON tmp.ID_ARTICLE = t.ID_ARTICLE
    WHERE t.PRIX = tmp.prix_mini
    Mais que doit-il se passer si plusieurs magasins affichent le même prix mini ?
    Ma requête les donnera tous.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Merci pour cette reponse rapide qui marche

    Bah ca ne me derange pas que si le prix soit identique, tous les resultats soient gardés. Mais puisqu'on est sur un forum, autant aller au bout. Si on dit qu'on veut prendre le premier magasin par ordre alphabetique, c'est possible d'ajouter dans la clause du group by le magasin ?

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Si on dit qu'on veut prendre le premier magasin par ordre alphabetique, c'est possible d'ajouter dans la clause du group by le magasin ?
    Si tu ajoutes le magasin dans le GROUP BY, tu auras le prix mini par article et par magasin, c'est à dire probablement la reproduction de ta table puisque je crois comprendre qu'il n'y a dans celle-ci qu'un prix par article et par magasin.

    Si tu veux le premier magasin par ordre alphabétique, tu dois pouvoir faire un MIN(MAGASIN) sur la requête générale. Et il faut de nouveau rapatrier le prix, ce qui fait un niveau de regroupement supplémentaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT t1.ID_ARTICLE, t1.MAGASIN, t1.PRIX
    FROM la_table AS t1
    INNER JOIN (
        SELECT t.ID_ARTICLE, MIN(t.MAGASIN) AS premier_magasin 
        FROM la_table AS t
        INNER JOIN (
        SELECT ID_ARTICLE, MIN(PRIX) AS prix_mini
        FROM la_table
        GROUP BY ID_ARTICLE
        ) AS tmp ON tmp.ID_ARTICLE = t.ID_ARTICLE
        WHERE t.PRIX = tmp.prix_mini
        GROUP BY t.ID_ARTICLE
    ) AS tmp2 ON tmp2.ID_ARTICLE = t1.ID_ARTICLE
    WHERE t1.MAGASIN = tmp2.premier_magasin
    À moins qu'il y ait plus simple...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si vous êtes en version 2005+.

    Pour la version avec tous les prix affichés en cas de doublons :
    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
    With SR (ID_ARTICLE, MAGASIN, PRIX, RK) as
    (
    select ID_ARTICLE, MAGASIN, PRIX,
           rank() over(partition by ID_ARTICLE order by PRIX asc)
      from Article
    )
    select ID_ARTICLE, MAGASIN, PRIX
      from SR
     where RK = 1;
     
    ID_ARTICLE  MAGASIN   PRIX
    ----------- --------- -----------
    1           Auchan    11
    2           Carrefour 50
    3           Leclerc   22
    La version avec le premier magasin trié alphabétiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH SR (ID_ARTICLE, MAGASIN, PRIX, RN) as
    (
    select ID_ARTICLE, MAGASIN, PRIX,
           row_number() over(partition by ID_ARTICLE order by PRIX asc, MAGASIN asc)
      from Article
    )
    select ID_ARTICLE, MAGASIN, PRIX
      from SR
     where RN = 1;

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Merci pour vos reponses

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/03/2012, 15h04
  2. Réponses: 0
    Dernier message: 05/09/2011, 20h26
  3. Réponses: 13
    Dernier message: 18/07/2011, 12h08
  4. [MySQL] Trier les résultats en fonction d'une colonne ordre
    Par eclipse012 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 05/01/2007, 13h59
  5. Afficher les enregistrements si le count() vaut 0
    Par j14z dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/04/2004, 09h51

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