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 MySQL Discussion :

Count en fonction de la valeur des tables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Par défaut Count en fonction de la valeur des tables
    Bonjour,

    je voudrais créer une requête qui compte le nombre de résultats identiques entre deux champs(valeur1 et 2) et le nombre de champs différents entre ces deux mêmes champs pour un élément donné.
    Un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
     
    Element Valeur1 valeur2
    A 1 1
    A 1 1
    A 0 0
    A 0 1
    A 1 0
    B 1 0
    En l'occurence pour le tableau ci-dessus, l'élément A les valeurs des champs valeur1 et valeur2 sont identiques pour 3 lignes et différents pour 2 lignes
    ce qui doit me donner en résultats ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ELEMENT NB_identique  NB_different
    A 3 2
    B 0 1
     etc
    j'ai bien essayé ça, mais bien sur ça marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select distinct element, count (valeur1 = valeur2), count (valeur1 != valeur2)
    from .....
    where ....
    group by element
    si quelqu'un pouvait m'aider à trouver une solution...
    merci par avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ca devrait le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select distinct ini.Element, eq.eq, dif.dif 
    from t ini 
     left outer join (select Element, count(*) as eq from t where Valeur1=Valeur2 group by Element) eq
      on ini.Element = eq.Element
     left outer join (select Element, count(*) as dif from t where Valeur1<>Valeur2 group by Element) dif
      on ini.Element = dif.Element;
    Ca risque de te renvoyer quelques null, tu mets un case ou un isnull ... suivant ton sgbd pour remplacer les null par des 0.

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Plus simplement peut-être:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT element,
           SUM(IF(valeur1 = valeur2),1,0) AS eq,
           SUM(IF(valeur1 <> valeur2),1,0) AS dif
    FROM latable
    WHERE ....
    GROUP BY element
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Invité
    Invité(e)
    Par défaut
    grmbl ....
    évidemment c'est plus simple .. et aussi probablement plus performant

  5. #5
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Par défaut
    Merci à tous les deux. J'essaie d'utiliser la seconde solution, car plus simple.
    Mais j'ai systématiquement le même message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     la fonction if(boolean) n'existe pas HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments. Vous devez ajouter des conversions explicites de type.explicit type casts.
    J'ai pensé que c'était dû au fait que mes champs contiennent des varchar, mais même en précisant le type de données et en éliminant dans la close where les caractères fautifs, je continue à avoir le même message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT element,
           SUM(IF (valeur1::integer = valeur2::integer),1,0) AS eq,
           SUM(IF(valeur1:integer<> valeur2::integer),1,0) AS dif
    FROM latable
    WHERE ..... AND valeur1 !='NA'
    GROUP BY element
    Une idée ?

  6. #6
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    SUM(IF (valeur1 = valeur2),1,0) AS eq,
    la syntaxe est mauvaise.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM( IF(condition, si vrai, si faux) )
    attention pas d'espace entre SUM, IF et la '('

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

Discussions similaires

  1. Lier des tables en fonction de la valeur de l'attribut
    Par ikayoo dans le forum Débuter
    Réponses: 4
    Dernier message: 04/03/2015, 12h18
  2. fonction sur la somme des valeurs issues d'une requete
    Par iam dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/06/2006, 21h35
  3. [Hibernate] Comment ramener les valeurs des tables de ref ?
    Par PamelaGeek dans le forum Hibernate
    Réponses: 9
    Dernier message: 07/02/2006, 23h52
  4. Réponses: 2
    Dernier message: 19/11/2005, 17h37
  5. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42

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