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 :

Aide requete avec COUNT


Sujet :

Langage SQL

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Aide requete avec COUNT
    Bonjour,

    J'ai une requete avec un COUNT mais je sais si je doit mettre COUNT(*) ou COUNT(nom colonne)Nombre de compte-clients par agence. (Y compris agences sans client.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT AGENCE.Nom, COUNT(*)
    FROM AGENCE
    LEFT OUTER JOIN COMPTE ON COMPTE.Num_Agence = AGENCE.Num_AGENCE
    GROUP BY AGENCE.NOM;
    Merci de votre réponse

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tout dépends de ce que tu veux compter.

    Mettons l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ID NOM  AGE
    -- ---- ---
     1 Toto  21
     2 Titi  45
     3 Tata  NULL
     4 Tutu  21
    Si tu veux compter :
    - Le nombre de LIGNES : COUNT(*) => 4
    - Le nombre d'âges NON NULS : COUNT(AGE) => 3
    - Le nombre d'âge différents : COUNT(DISTINCT AGE) => 2

    Quand on veut compter le nombre de lignes, on ne se pose pas de question : plutôt que de prendre une colonne non null (ce qui aura le même effet) on préférera toujours utiliser * (et c'est le seul cas où on peut utiliser *) car au lieu de lire physiquement les données dans la table, le SGBD peut se contenter de compter les lignes de résultat qu'il a déjà en mémoire.
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    si tu mets un group by l'argument de count peut prendre m'importe quoi. ce sera inutile de spécifier un champ dans le count.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Là on veut le nombre de compte-clients par agence, y compris les agences qui on n'ont pas

  5. #5
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Je voix que c'est correcte.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par islamov2000 Voir le message
    si tu mets un group by l'argument de count peut prendre m'importe quoi. ce sera inutile de spécifier un champ dans le count.
    FAUX !

    Le GROUPY BY ne change rien en ce qui concerne le comportement du COUNT() lui-même. Il ne sert qu'à produire différents sous-résultats selon un critère de regroupement.

    Exemple : (Script à la syntaxe SQL Server)
    Code sql : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    drop table examen;
    drop table matiere;
    drop table eleve;
    drop table classe;
     
    create table classe (id int primary key identity, nom varchar(50) not null unique);
    create table eleve (id int primary key identity, nom varchar(50) not null, classe_id int not null references classe(id));
    create table matiere (id int primary key identity, nom varchar(50) not null unique);
    create table examen (id int primary key identity, eleve_id int not null references eleve(id), matiere_id int not null references matiere(id), note decimal(3,1) null);
     
    insert into classe (nom) values ('Seconde');
    insert into classe (nom) values ('Première');
    insert into classe (nom) values ('Terminale');
     
    insert into eleve (nom, classe_id) values ('Alain', 1);
    insert into eleve (nom, classe_id) values ('Alfred', 1);
    insert into eleve (nom, classe_id) values ('Bruno', 2);
    insert into eleve (nom, classe_id) values ('Benoît', 2);
    insert into eleve (nom, classe_id) values ('Alain', 3);
    insert into eleve (nom, classe_id) values ('Bruno', 3);
     
    insert into matiere (nom) values ('Mathématiques');
    insert into matiere (nom) values ('Histoire');
    insert into matiere (nom) values ('Anglais');
     
    insert into examen (eleve_id, matiere_id, note) values (1, 1, 15);
    insert into examen (eleve_id, matiere_id, note) values (1, 2, NULL);
    insert into examen (eleve_id, matiere_id, note) values (1, 3, 8.5);
     
    insert into examen (eleve_id, matiere_id, note) values (2, 1, 9.5);
    insert into examen (eleve_id, matiere_id, note) values (2, 2, 16);
    insert into examen (eleve_id, matiere_id, note) values (2, 3, 12);
     
    insert into examen (eleve_id, matiere_id, note) values (3, 1, 6);
    insert into examen (eleve_id, matiere_id, note) values (3, 2, 7.5);
    insert into examen (eleve_id, matiere_id, note) values (3, 3, 4);
     
    insert into examen (eleve_id, matiere_id, note) values (4, 1, 12);
    insert into examen (eleve_id, matiere_id, note) values (4, 2, 20);
    insert into examen (eleve_id, matiere_id, note) values (4, 3, 14);
     
    insert into examen (eleve_id, matiere_id, note) values (5, 1, 16);
    insert into examen (eleve_id, matiere_id, note) values (5, 3, 14);
     
    insert into examen (eleve_id, matiere_id, note) values (6, 1, 2);
    insert into examen (eleve_id, matiere_id, note) values (6, 3, 4);
     
    select m.nom, count(*) -- 6 examens pour mathématiques et anglais, et 4 pour histoire
    from classe c
    inner join eleve e on e.classe_id = c.id
    inner join examen x on x.eleve_id = e.id
    inner join matiere m on m.id = x.matiere_id
    group by m.nom;
     
    select m.nom, count(x.note) -- 6 notes pour l'anglais et les maths, 3 pour l'histoire (Alain de seconde absent : NULL)
    from classe c
    inner join eleve e on e.classe_id = c.id
    inner join examen x on x.eleve_id = e.id
    inner join matiere m on m.id = x.matiere_id
    group by m.nom;
     
     
    select m.nom, count(distinct e.nom) -- 4 noms d'élève différents ont passé un examen dans chacune des trois matières
    from classe c
    inner join eleve e on e.classe_id = c.id
    inner join examen x on x.eleve_id = e.id
    inner join matiere m on m.id = x.matiere_id
    group by m.nom;

    => Le GROUP BY est le même, et pourtant COUNT() ne renvoie pas le même résultat selon ce qu'on met en paramètre !
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Tu as raison StringBuilder, moi j'ai pris des mauvais exemples dans mes tests
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

Discussions similaires

  1. requete avec count qui renvoit un unique résultat
    Par omageus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/01/2009, 18h30
  2. [mysql 5] requete avec count+ having + group by
    Par epeichette dans le forum Requêtes
    Réponses: 7
    Dernier message: 29/10/2008, 19h52
  3. [HQL] aide requete avec from T where t.a in ?
    Par Sniper37 dans le forum Hibernate
    Réponses: 2
    Dernier message: 12/02/2008, 14h08
  4. Requetes Avec Count et condition sur date
    Par Harry dans le forum WinDev
    Réponses: 1
    Dernier message: 04/06/2007, 15h23
  5. Comment optimiser une Requete avec Count ?
    Par tavarlindar dans le forum Requêtes
    Réponses: 15
    Dernier message: 09/02/2007, 21h19

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