Сделать отчет из 3 разных таблиц, используя MAX и COUNT? - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть база данных пациентов, врачей, кабинетов и посещений.

Пациенты ( id_pac , Имя, Фамилия)

Врачи ( id_med , Имя, Фамилия, Специальность)

Шкафы ( id_cab , Имя)

Визиты (id_viz, Date_viz, Medic_id, Patient_id, Cabinet_id )

Один врач может посещать разных пациентов, в разных кабинетах, в разные даты.

Мне нужно выяснить (с подзапросом или с объединением?, Но НЕ с промежуточными таблицами или представлениями) в одном отчете:

  1. один столбец с полным именем врача : CONCAT (Имя, Фамилия, Имя) ( DISTINCT ),
  2. одна колонка с именем кабинета, в котором доктор имел наибольшее количество посещений а также 3. один столбец с количеством посещений этого кабинета.

Я пытался выяснить, как я могу получить эту информацию, но все, что я могу, это список врачей со всеми кабинетами, в которых он посещал, с общим количеством посещений / кабинет: ((

Ответы [ 2 ]

1 голос
/ 02 декабря 2011
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 голосов
/ 17 декабря 2011

Я пытался лучше понять этот подзапрос, и я нашел другой способ (простой, я верю).Код:

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: Пожалуйста, дайте мне знать, если увидите какие-то различия, потому что важно посмотреть, забыл ли я что-нибудь или сбежал.

...