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 :

[debutant]sous-requetes COUNT(*) comme champs


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par défaut [debutant]sous-requetes COUNT(*) comme champs
    Bonjour,

    Je n'ai pas le code de la creation des tables, mais la requete devrait suffire. SPECIE_ID est la clef primaire de SPECIE, STUDY_ID celle de STUDY, AGENT_ID,STUDY_ID celle de STUDY_AGENT, AGENT_ID celle de AGENT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT AGENT.AGENT_CODE, SPECIE.SPECIE_NAME
    FROM SPECIE, STUDY, STUDY_AGENT, AGENT
    WHERE SPECIE.SPECIE_ID = STUDY.SPECIE_ID
        AND STUDY.STUDY_ID = STUDY_AGENT.STUDY_ID
        AND STUDY_AGENT.AGENT_ID = AGENT.AGENT_ID
    ORDER BY AGENT.AGENT_CODE, SPECIE.SPECIE_NAME
    me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    AGENT_CODE	SPECIE_NAME	
    4-ABP                  Mouse	
    4-ABP	             Mouse	
    4-NQO	             Mouse	
    4-NQO	             Rat	
    4-NQO	             Rat	
    4-NQO	             Rat	
    4-NQO	             Rat	
    5-MeC	             Mouse	
    6-NC	             Mouse	
    6-NC	             Mouse
    Or je voudrais avoir comme resultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AGENT_CODE	Mouse	Rat
    4-ABP	            2	0
    4-NQO	            1	4          	
    5-MeC	            1	0
    6-NC	            2	0
    J'ai essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT AGENT.AGENT_CODE, (
    	SELECT COUNT(*)
    	FROM SPECIE
    	WHERE SPECIE.SPECIE_NAME = 'Rat'
    		AND STUDY.SPECIE_ID=SPECIE.SPECIE_ID
    		AND STUDY.STUDY_ID = STUDY_AGENT.STUDY_ID
    		AND STUDY_AGENT.AGENT_ID = AGENT.AGENT_ID) AS Rat
    FROM SPECIE, STUDY, STUDY_AGENT, AGENT
    WHERE SPECIE.SPECIE_ID = STUDY.SPECIE_ID
    	AND STUDY.STUDY_ID = STUDY_AGENT.STUDY_ID
    	AND STUDY_AGENT.AGENT_ID = AGENT.AGENT_ID
    GROUP BY AGENT.AGENT_CODE
    mais j'ai l'erreur:

    ERROR at line 5:
    ORA-00979: not a GROUP BY expression

    Je suis un peu perdu dans les group by que je dois faire, dans la premiere et la deuxieme requete. Auriez-vous une idee?

    Merci d'avance,

    Romain

  2. #2
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Lorsque l'on a SELECT a, b, c, count(*),sum(d) on doit toujours avoir un GROUP BY a,b,c, c'est à dire un regroupement de toutes les colonnes exceptées celles subissant une fonction d'agrégation.

    D'autre part il vaut mieux éviter les SELECT dans les SELECT et préférer les jointures entre sous-requêtes. Mais les sous-requêtes ne sont pas nécessaires visiblement au vu du besoin.

    voici une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT AGENT.AGENT_CODE, 
    SUM(case when  SPECIE.SPECIE_NAME='Mouse' then 1 else 0 end) Mouse
    SUM(case when  SPECIE.SPECIE_NAME='Rat' then 1 else 0 end) Rat
    FROM SPECIE, STUDY, STUDY_AGENT, AGENT
    WHERE SPECIE.SPECIE_ID = STUDY.SPECIE_ID
        AND STUDY.STUDY_ID = STUDY_AGENT.STUDY_ID
        AND STUDY_AGENT.AGENT_ID = AGENT.AGENT_ID
    GROUP BY AGENT.AGENT_CODE
    sinon de façon plus généraliste mais sans avoir une pseudo-colonne par SPECIE_NAME:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT AGENT.AGENT_CODE, SPECIE.SPECIE_NAME,
    count(*)
    FROM SPECIE, STUDY, STUDY_AGENT, AGENT
    WHERE SPECIE.SPECIE_ID = STUDY.SPECIE_ID
        AND STUDY.STUDY_ID = STUDY_AGENT.STUDY_ID
        AND STUDY_AGENT.AGENT_ID = AGENT.AGENT_ID
    GROUP BY AGENT.AGENT_CODE,SPECIE.SPECIE_NAME

  3. #3
    Membre confirmé Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par défaut
    Youhou! ca marche. merci beaucoup, je connaissais pas ce truc des SUM(case...)

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

Discussions similaires

  1. Sous requetes count : more than 1 row
    Par maximenet dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/05/2012, 14h25
  2. update avec sous requete count()
    Par gianni7033 dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/02/2011, 15h38
  3. Not In et Sous requete renvoyant deux champs
    Par ToTo13 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/03/2008, 16h39
  4. Réponses: 3
    Dernier message: 01/08/2007, 09h26
  5. Probleme de sous requete DEBUTANT
    Par nashouille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/09/2005, 11h47

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