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 count et requetes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut SQL count et requetes
    Bonjour,

    J'aimerais faire une requête qui semble simple mais pourtant...

    J'ai une table client, une table utilisateur et une table matériel.
    Un client possède des utilisateurs et des materiels.

    Je voudrais en une seule requête afficher toutes les informations de client + count(user) par client et le count(mat) par client.

    Je ne vois pas comment faire, j'ai essayé quelque chose comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct(client.id),count("user")  from client JOIN "user" ON (client.id = client_id) group by client.id;
    je n'ai pas toutes les infos et je ne peux pas ordonner by client.

    Avez vous une idée ?

    Merci

  2. #2
    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
    DISTINCT n'est pas une fonction mais un attribut du SELECT et est inutile avec la présence d'un GROUP BY.

    Quel est votre SGBD ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    oui effectivement je suis d'accord pour distinct.

    j'utilise postgresql 8.0

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    D'où devrait venir le count(mat) ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    le count(mat) vient de la table mat qui posséde une référence vers le client dans la colonne client_id.

    Globalement ma requête devrait ressembler à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select client.*,count(user),count(mat) from client JOIN user ON (client.id = client_id) JOIN mat ON (client.id = client_id) group by client
    Mais cela ne fonctionne pas (on ne peut pas grouper par client) et je suis pas sur que la double jointure cartesienne ne me donne pas des résultats érronnés.

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Pour ta dernière requête, ça ne marche pas à cause de : client.*
    Car en fait, tu ne peux pas GROUP BY client : il faut que tu cites les colonnes.
    Et seules les colonnes du groupement ou des count / sum / avg / ... peuvent se trouver dans le SELECT.

    La requête de Waldar n'est pas un double produit cartésien.

    Le problème, lorsque tu veux compter 2 ensembles différents, c'est que tu ne peux pas faire la jointure totale en premier, sinon les lignes se "multiplient".
    Exemple :
    Si tu as 2 users pour un client et 3 mat, la jointure :
    client JOIN users JOIN mat te renvoie 6 lignes !

    C'est pourquoi Waldar commence dans les expressions aliasées usr et mat par faire le comptage, afin de n'avoir au plus qu'une ligne par client qui porte les sommes respectives.

    Tu vois l'idée ?

  7. #7
    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
    Je le ferai ainsi :
    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
    select
        cli.id,
        coalesce(usr.nb_usr, 0) as nb_usr,
        coalesce(mat.nb_mat, 0) as nb_mat
    from
        client as cli
        left outer join (select client_id, count(*) as nb_usr
                         from "user"
                         group by client_id) as usr
          on cli.id = usr.client_id
        left outer join (select client_id, count(*) as nb_mat
                         from materiel
                         group by client_id) as mat
          on cli.id = mat.client_id
    order by
        cli.id asc
    Ce n'est pas la seule méthode.

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

Discussions similaires

  1. Requete SQL - count dans un left join
    Par JbWillGetYou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/06/2010, 01h07
  2. Requete SQL count
    Par rednight dans le forum Langage SQL
    Réponses: 0
    Dernier message: 05/06/2009, 12h28
  3. [SQL] Erreur repetitive sur requete SQL (Count et Sum)
    Par hools dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2007, 11h57
  4. Requete SQL : COUNT GROUP BY
    Par Florent08800 dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/10/2006, 10h04
  5. [Tableaux] affichage tableau php apres requete sql count
    Par heteroclite dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 20h53

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