Partage
  • Partager sur Facebook
  • Partager sur Twitter

Having Max et avg

Sujet résolu
    26 juillet 2010 à 15:22:04

    Bonjour
    CREATE TABLE Nageurs
    (NrLigue CHAR(6)
    	 CONSTRAINT CpNageurs PRIMARY KEY,
    Nom VARCHAR2(20) 
    	 CONSTRAINT NageursNomNotNULL CHECK (Nom IS NOT NULL),
    Prenom VARCHAR2(20)
    	 CONSTRAINT NageursPrenomNotNULL CHECK (Prenom IS NOT NULL),
    AnneeNaiss NUMBER(4)
    	 CONSTRAINT NageursAnneeNotNULL CHECK (AnneeNaiss IS NOT NULL),
    Sexe CHAR(1)
    	 CONSTRAINT NageursSexeFM CHECK (Sexe IN ('F','M'))
    	 CONSTRAINT NageursSexeNotNull CHECK (Sexe IS NOT NULL),
    Categorie CHAR(2)
      CONSTRAINT RefNageursCategories  REFERENCES Categories(Categorie),
    Club CHAR(5)
      CONSTRAINT RefNageursClubs  REFERENCES Clubs (Club),
     Adresse VARCHAR2(50),
     CodePostal CHAR(5)
            CONSTRAINT RefNageursCodePostaux REFERENCES CodePostaux (CodePostal),
     Localite VARCHAR2(20),
     NrTelephone CHAR(15),
     EMAIL VARCHAR2(50),
     GSM CHAR(15),
     Cotisation CHAR(1) 
    );
    



    je cherche le code club qui à la moyenne d'âge la plus élevé mais je ne trouve pas
    :-°

    voici ma petite requête qui ne marche pas sous oracle
    select club,max(avg(extract(YEAR from current_date) - anneenaiss)) as MaxMoy
    from nageurs
    group by club;
    


    Je vois qu'une solution pour la résoudre c'est le having mais je le maitrise très peu ... :euh:

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2010 à 15:43:11

      Salut, si tu regardes sur la doc d'Oracle ici:
      http://psoug.org/reference/select.html

      tu obtiens cette syntaxe et quelques exemples:

      SELECT <column_name>, <aggregating_operation>
      FROM <table_name>
      GROUP BY <column_name>
      HAVING <aggregating_op_result> <condition> <value>;
      SELECT object_type, COUNT(*)
      FROM all_objects
      WHERE SUBSTR(object_name,1,1) BETWEEN 'A' AND 'W'
      GROUP BY object_type
      HAVING COUNT(*) < 6;
      
      SELECT object_type, COUNT(*)
      FROM all_objects
      WHERE SUBSTR(object_name,1,1) BETWEEN 'A' AND 'W'
      GROUP BY object_type
      HAVING COUNT(*) > 5;
      



      Dans ton cas j'essaierai un truc du genre:

      SELECT club, max(avg(extract(YEAR from current_date) - anneenaiss)) as MaxMoy, avg(extract(YEAR from current_date) - anneenaiss) as Moy
      FROM nageurs
      GROUP BY club
      HAVING Moy=MaxMoy;
      



      Si ça ne marche pas je te laisse bidouiller en te servant des exemples de la doc, HAVING est en effet la bonne solution à utiliser dans ce cas (sélection après regroupement).

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        26 juillet 2010 à 17:46:08

        j'ai trouvé sa mais je ne pense pas que c'est l'une des meilleurs solutions :-°
        select club 
        from nageurs
        group by club
        having avg(extract(YEAR from current_date) - anneenaiss) = 
        (
        	select max(Moy)
        	from 
        	(
        		SELECT club, avg(extract(YEAR from current_date) - anneenaiss) as Moy
        		FROM nageurs
        		GROUP BY club
        	)
        );
        
        • Partager sur Facebook
        • Partager sur Twitter
          26 juillet 2010 à 23:30:01

          select club, avg(extract(YEAR from current_date) - anneenaiss) as moy
          from nageurs
          group by club
          ORDER BY moy
          LIMIT 1;
          
          • Partager sur Facebook
          • Partager sur Twitter

          Having Max et avg

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown