SQL 'group by'

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : SQL 'group by'

Re: SQL 'group by'

par sadeq » 28 déc. 2012, 18:42

En principe, selon les règles SQL, le group by doit reprendre la liste des champs listés dans le SELECT excepté les champs de calcul. C'est pour cela que la plupart des systèmes de gestion de bases de données (SGBD) comme SQL Server, Oracle, Postgres, ... qui respectent le standard SQL exige cette syntaxe. D'autres SGBD sont plus tolérants comme MySQL ne l'exige pas.

SQL 'group by'

par Amélie » 28 déc. 2012, 14:23

Bonjour

J'ai une base de données permettant la gestion entre les medecins et leurs patients et contenant les tables suivantes :
PATIENT (numAs, nomp, prenomp, sexe, dateNaiss, matriculem#)
MEDECIN (matricule, nomm, prenomm, specialite, ville, adr)
CONSULTE (matricule#, numAs#, date, diagnostic,numOrd#)

indication: matriculem est une clè étrangère qui a pour référence medecin(matricule)
je dois écrire la requête SQL qui permet de : "Afficher le nom et le prénom du ou des médecins qui sont médecins traitants du plus grand
nombre de patients "

quand j'écris :
select  nomm,prenomm,count(numas) 
         from patient,medecin 
	 group by matriculem
                    having(
                     matriculem=matricule and count(numas)=
                                                           (select max(champ) 
                                                                from (select count(numas) as champ 
                                                                                 from patient group by matriculem) y));
--> cela ne fonctionne pas

mais quand j'écris (en suivant les messages de postgres) :
select  nomm,prem,count(numas) 
         from patient,medecin 
	 group by matriculem,medecin.nomm,medecin.prenomm,medecin.matricule
                    having(
                     matriculem=matricule and count(numas)=
                                                           (select max(champ) 
                                                              from (select count(numas) as champ 
                                                                              from patient group by matriculem) y));
--> cela fonctionne très bien

cependant je ne vois pas pourquoi j'ai à ajouter au group by le nomm le prenomm et la matricule de la table medecin.
quelqu'un pourrait m'expliquer cela ? et aussi,j'aimerais bien savoir s'il y a une façon plus simple(plus claire) pour écrire cette requête.