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 :

Select, avec conditions sur 4 champs simultanément


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut Select, avec conditions sur 4 champs simultanément
    Bonjour,

    J'ai une table telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    | parc  |CREATE TABLE `parc` (
      `machine` varchar(25) NOT NULL default '',
      `fonction` varchar(25) default NULL,
      `model` varchar(25) NOT NULL default '',
      `client` varchar(25) NOT NULL default '',
      `reference` varchar(25) default NULL,
      PRIMARY KEY  (`machine`),
      KEY `reference` (`reference`),
      KEY `projet` (`projet`),
      KEY `fonction` (`fonction`),
      KEY `model` (`model`),
      KEY `cli_pro_mod_fon` (`client`,`projet`,`model`,`fonction`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    Pour chaque quadruplé `client`,`projet`,`model`,`fonction`, j'aimerais récupérer les entrées (et le nombre d'entrées) différentes pour ce même quadruplé.

    En effet, je suis censé n'avoir qu'une entrée pour un quadruplé, mais ce n'est pas tout le temps le cas, et je dois récupérer les entrées afin de résoudre les anomalies au cas par cas.

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Avez-vous un peu cherché ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select <vos quatre colonnes>, count(*)
    from parc
    group by <vos quatre colonnes>

  3. #3
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    J'ai déjà effectué cette requête, et j'obtiens en effet le nombre de fois où les entrées sont "doublonnées" sur les 4 champs en question.

    Mais j'aimerais obtenir toutes ces entrées doublonnées, c'est-à-dire celle où le count(*) ne sera pas égal à un.

    J'essaie de faire une requête imbriquée dans une autre, où la condition sera que le count(*) sera différent de 1, mais j'avoue que j'ai du mal à faire quelque chose qui fonctionne.


  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    HAVING ?

  5. #5
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Il faut chercher du côté de HAVING...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT <vos quatre colonnes>, COUNT(<vos quatre colonnes>)
    FROM parc
    GROUP BY <vos quatre colonnes>
    HAVING COUNT(<vos quatre colonnes>)>1

  6. #6
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    J'ai réussi à faire une première partie de ce qui m'intéressait, merci.

    J'aimerais aussi faire quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    +-----------+--------+--------+----------+-------------------+---------+
    | reference | client | projet | fonction | model  | counter |
    +-----------+--------+--------+----------+-------------------+---------+
    | 100 | WIN    | WEB     | ACHAT    | MAXIM1 |       2 |
    | 227 | WIN    | WEB     | ACHAT    | MAXIM1 |       2 |
    | 467 | WIN    | WEB     | ACHAT    | MAXIM5 |       4 |
    | 311 | WIN    | WEB     | ACHAT    | MAXIM5 |       4 |
    | 984 | WIN    | WEB     | ACHAT    | MAXIM5 |       4 |
    | 686 | WIN    | WEB     | ACHAT    | MAXIM5 |       4 |
    A savoir, afficher les entrées qui contiennent une combinaison "client | projet | fonction | model" identique (pourvu qu'il y en ait au moins 2 identiques), et que j'ai un nouveau champ "counter", qui m'indique le nombre d'entrées faisant référence à cette combinaison.

    Je fais quelque chose comme ça, mais ça ne marche pas comme je voudrais :

    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 reference, client, projet, fonction, model, count(distinct client,projet,fonction,model,reference) as counter  
    from parc 
    where reference !='' 
    group by client, projet, fonction, model, reference 
    having count(*)>1;
    +-----------+--------+--------+----------+-------------------+---------+
    | reference | client | projet | fonction | model  | counter |
    +-----------+--------+--------+----------+-------------------+---------+
    | 100 | WIN    | WEB     | ACHAT    | MAXIM1 |       1 |
    | 227 | WIN    | WEB     | ACHAT    | MAXIM1 |       1 |
    | 467 | WIN    | WEB     | ACHAT    | MAXIM5 |       1 |
    | 311 | WIN    | WEB     | ACHAT    | MAXIM5 |       1 |
    | 984 | WIN    | WEB     | ACHAT    | MAXIM5 |       1 |
    | 686 | WIN    | WEB     | ACHAT    | MAXIM5 |       1 |
    Une idée sur la manière dont je peux obtenir une colonne "counter" coorecte?
    Merci beaucoup.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 111
    Points : 28 462
    Points
    28 462
    Par défaut
    Quel SGBD utilisez vous ?
    Quelle est la structure de la table (ou des tables) en jeu ?
    Quelle la requête qui produit de résultat ?
    Pourquoi, fonctionnellement, le résultat n'est-il pas le bon ?

  8. #8
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    C'est du mysql.

    La structure de la table se situe dans le 1er post du sujet.

    Dans le post précédent, la requête que j'ai passé, et qui ne me donne pas le résultat escompté, apparait.

    Je l'ai mise, ainsi que le résultat que ça renvoie, pour éclairer mieux les forumeurs sur ce que je tente de faire (que j'explique aussi d'ailleurs).

    Pourquoi le résultat n'est pas le bon, c'est ce que je cherche à savoir, et c'est la raison pour laquelle, en plus de ma réflexion, j'essaie d'avoir l'aide de yeux plus avisés que moi sur mon problème.

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 111
    Points : 28 462
    Points
    28 462
    Par défaut
    Y a-t-il plus d'une ligne identifiée par "100 | WIN | WEB | ACHAT | MAXIM1" ?

  10. #10
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Y a-t-il plus d'une ligne identifiée par "100 | WIN | WEB | ACHAT | MAXIM1" ?
    Non.

    Seulement plusieurs entrées identifiées par "WIN | WEB | ACHAT | MAXIM1", celles que je veux afficher, et compter.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Il faut retirer reference du regroupement, et chercher les references correspondant à vos (client, projet, fonction, model) à l'aide d'une jointure :
    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
     
    SELECT 
          p1.reference,
          p1.client,
          p1.projet,
          p1.fonction,
          p1.model,
          p2.counter
    FROM parc p1
    JOIN (	   	   
          SELECT 
                client, 
                projet, 
                fonction, 
                model, 
                count(*) AS counter  
          FROM parc 
          WHERE reference <> '' 
          GROUP BY client, projet, fonction, model 
          HAVING count(*)>1
          ) p2 
    ON p1.client = p2.client
    AND p1.projet = p2.projet
    AND p1.fonction = p2.fonction
    AND p1.model = p2.model;

Discussions similaires

  1. Boucle If avec condition sur un Champ.
    Par shmider dans le forum IHM
    Réponses: 3
    Dernier message: 25/11/2010, 13h39
  2. Update or insert avec conditions sur les champs
    Par calou_33 dans le forum SQL
    Réponses: 7
    Dernier message: 04/08/2010, 10h36
  3. Réponses: 6
    Dernier message: 09/09/2008, 16h42
  4. Réponses: 0
    Dernier message: 05/02/2008, 10h09
  5. [MySQL] Requête avec condition sur un champ
    Par nonhosonno dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/02/2007, 14h00

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