2011-12-01 5 views
2

J'ai une base de données avec des patients, des médecins, des cabinets et des visites.Faire un rapport à partir de 3 tables différentes en utilisant MAX et COUNT?

patients (id_pac, FirstName, LastName)

Médecins (id_med, FirstName, LastName, spécialité)

Armoires (id_cab, Nom)

Vizits (id_viz, Date_viz, Medic_id, Patient_id, Cabinet_id)

Un médecin peut effectuer des visites sur différents patients, dans différents cabinets, à différentes dates.

J'ai besoin de savoir (avec un sous-requête ou une jointure, mais pas avec des tables ou des vues intermédiaires?), Dans un rapport:

  1. une colonne avec nom complet du médecin: CONCAT (FirstName, » », LastName) (DISTINCT),
  2. une colonne avec le nom du cabinet où le médecin était d'avoir le plus grand nombre de visites et 3.one colonne avec le nombre de visites pour ce cabinet .

J'ai essayé de comprendre comment puis-je obtenir ces informations, mais tout ce que je peux avoir est la liste des médecins avec tous les cabinets où il avait de la visite, le nombre total de visites/coffret: . ((

Répondre

1
SELECT CONCAT(d.FirstName,' ',d.LastName) AS CompleteName 
    , c.Name        AS CabinetName 
    , dv.MaxVisits      AS MaxVisits 
FROM Doctors AS d 
    LEFT JOIN 
    (SELECT Medic_id 
      , MAX(NumVisits) AS MaxVisits 
     FROM 
     (SELECT Medic_id 
       , Cabinet_id 
       , COUNT(*) AS NumVisits 
      FROM Vizits AS v 
      GROUP BY Medic_id 
       , Cabinet_id 
     ) AS grp 
     GROUP BY Medic_id 
    ) AS dv 
    ON dv.Medic_id = d.id_med 
    LEFT JOIN 
    (SELECT Medic_id 
      , Cabinet_id 
      , COUNT(*) AS NumVisits 
     FROM Vizits AS v 
     GROUP BY Medic_id 
      , Cabinet_id 
    ) AS mcv 
    ON mcv.Medic_id = dv.Medic_id 
    AND mcv.NumVisits = dv.MaxVisits 
    LEFT JOIN Cabinets AS c 
     ON c.id_cab = mcv.Cabinet_id 
+0

Uau, c'est exactement ce dont j'ai besoin. Je ne pense pas que c'était une chance de trouver cette requête par moi-même. Je vous donne également un «clic» pour votre voyage spatial potentiel:) Merci – mgm

+0

@GabrielMandu: Thnx. Vous pouvez également cocher cette réponse, si cela vous a été utile. –

+0

Yeap, je l'ai déjà fait :) – mgm

0

je tente de mieux comprendre cette sous-requête et je trouve une autre façon (un simple un je crois) Le code est:

SELECT 
CONCAT(me.Nume,' ',me.Prenume) AS Medic, 
x.Denumire, 
MAX(x.nrviz) AS maxviz 
FROM (
     SELECT DISTINCT 
      v.Medic_id, 
      c.Denumire, 
      COUNT(v.id_viz) AS nrviz 
     FROM 
      vizite v 
     LEFT JOIN 
      cabinete c 
     ON(v.Cabinet_id=c.id_cab) 
     GROUP BY 
      v.Medic_id, 
      v.Cabinet_id 
     ORDER BY 
      nrviz DESC) as x 
LEFT JOIN 
medici me 
ON (x.Medic_id=me.id_med) 
LEFT JOIN 
cabinete ca 
ON (x.Denumire=ca.Denumire) 
GROUP BY 
Medic 
ORDER BY 
    Medic, 
    maxviz DESC 

@ypercube: S'il vous plaît laissez-moi savoir si vous voyez des différences , parce que c'est important de voir si j'ai oublié ou échappé à quelque chose.

Questions connexes