Сводные столбцы не в группе по - PullRequest
0 голосов
/ 28 ноября 2011

В T-SQL (SQL Server 2008 R2, если это уместно), как лучше всего написать следующий запрос?

select dfd.ListName as ProvName, COUNT(distinct pv.PatientProfileId)
    from PatientVisit pv
        join DoctorFacility dfd on pv.DoctorId = dfd.DoctorFacilityId
    group by pv.DoctorId

Я могу придумать несколько разных способов сделать это.Реально, я мог бы, вероятно, просто группировать по dfd.ListName, но я просто достаточно параноик, чтобы беспокоиться о найме двух Джона Смитов.:-) Я знаю, что другой вариант будет

select dfd.ListName as ProvName, DistPatCount 
    from (
        select pv.DoctorId, COUNT(distinct pv.PatientProfileId) as DistPatCount
            from PatientVisit pv
            group by pv.DoctorId
        ) pvc 
        join DoctorFacility dfd on pvc.DoctorId = dfd.DoctorFacilityId

, но «безобразный» - самый политичный способ описать это.:-) Кроме того, я подумал, что кто-то узнает что-то, чего мне не хватает ...

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Возможно, самый чистый способ справиться с этим - создать представление о количестве пациентов.Мне трудно поверить, что это единственное место, где это было бы полезно.

В качестве альтернативы, вы можете определить CTE (это в основном встроенный вид), содержащий эту информацию:

WITH Patient_Count (SELECT doctorId, COUNT(DISTINCT patientProfileId) as patientCount
                    FROM PatientVisit
                    GROUP BY doctorId)

SELECT a.listName as provName, b.patientCount
FROM DoctorFacility as a
JOIN Patient_Count as b
ON b.doctorId = a.doctorFacilityId

(хотя, действительно ли doctorId равен doctorFacilityId? Кажется, он говорит: «Да, тот доктор, он на самом деле здание ».)

1 голос
/ 28 ноября 2011

Если бы SQL был немного умнее, вы могли бы сделать следующее, потому что вы знаете, что для данного врача может быть только одно средство.

select pv.DoctorId, dfd.ListName as ProvName, COUNT(distinct pv.PatientProfileId)
    from PatientVisit pv
        join DoctorFacility dfd on pv.DoctorId = dfd.DoctorFacilityId
    group by pv.DoctorId

К сожалению, правило с одним значением в SQL слишком строго, и оно не позволяет вам этого делать. Правило с одним значением состоит в том, что любой столбец в списке выбора должен быть либо в предложении GROUP BY, либо в статистической функции, независимо от того, что он на самом деле не является двусмысленным в случае, подобном приведенному выше. .

Таким образом, мы можем написать следующее для соответствия SQL, хотя логически нет необходимости помещать ListName в агрегатную функцию:

select pv.DoctorId, MAX(dfd.ListName) as ProvName, COUNT(distinct pv.PatientProfileId)
    from PatientVisit pv
        join DoctorFacility dfd on pv.DoctorId = dfd.DoctorFacilityId
    group by pv.DoctorId

Я предполагаю, что pv.DoctorId - это внешний ключ, ссылающийся на dfd.DoctorFacilityId, а не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...