Access 2007: "SELECT COUNT (DISCTINCT …"

Tengo una tabla que contiene un StudyId, un PatientId y StudyStartDateTime. Me gustaría graficar los totales de los Estudios y Pacientes entre dos dates especificadas por el usuario. El problema es contar valores distintos. Aquí está la consulta:

SELECT s.StudyStartDateTime, COUNT(s.StudyId), COUNT(s.PatientId) FROM dbo_Study_ViewX211_Rpt AS s WHERE s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate GROUP BY s.StudyStartDateTime ORDER BY s.StudyStartDateTime; 

Esta consulta funciona casi como debería, excepto que count duplicates de filas con el mismo ID de estudio o el mismo ID de paciente. Sé que Access no es compatible con COUNT (DISTINCT …), pero estoy teniendo problemas para solucionarlo. Cualquier ayuda será muy apreciada.

Podría intentar hacerlo con subconsultas para los recuentos, pero las subconsultas correlacionadas tienden a picar en lo que respecta al performance.

Si está dispuesto a hacer esto en dos consultas en lugar de una, estas funcionarían:

 SELECT s.StudyStartDateTime, COUNT(s.PatientId) FROM dbo_Study_ViewX211_Rpt AS s WHERE s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate GROUP BY s.StudyStartDateTime, s.PatientId ORDER BY s.StudyStartDateTime; SELECT s.StudyStartDateTime, COUNT(s.StudyId), FROM dbo_Study_ViewX211_Rpt AS s WHERE s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate GROUP BY s.StudyStartDateTime, s.StudyId ORDER BY s.StudyStartDateTime; 

Tenga en count que agregué los campos contados a las expresiones GROUP BY en cada uno.

Si desea que sea más "compacto", puede crear una vista para cada una de estas consultas y unirlas a una consulta distinta en StudyStartDateTime para get resultados en un solo set de resultados.

Notado el prefijo dbo_ – ¿está esto vinculado a una database de SQL Server?

De ser así, puede usar una consulta de paso a través y usar la syntax COUNT (DISTINCT …) ya que pasará directamente a SQL Server.

Poniendo esto en una respuesta separada para que pueda ser votado independientemente, pero este artículo de blog habla sobre hacer esto con el enfoque de subconsulta:

Escribir una consulta Count (Distinct) en Access

He tomado la sugerencia de JohnFx, y he creado estas dos subconsultas:

numStudiesByDate:

 SELECT t.StudyStartDateTime, COUNT(s.StudyId) AS numStudies FROM (SELECT DISTINCT StudyId FROM dbo_Study_ViewX211_Rpt GROUP BY StudyId) AS s INNER JOIN dbo_Study_ViewX211_Rpt AS t ON t.StudyId=s.StudyId WHERE t.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, t.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate GROUP BY t.StudyStartDateTime ORDER BY t.StudyStartDateTime; 

numPatientsByDate:

 SELECT t.StudyStartDateTime, COUNT(s.PatientId) AS numPatients FROM (SELECT DISTINCT PatientId FROM dbo_Study_ViewX211_Rpt GROUP BY PatientId) AS s INNER JOIN dbo_Study_ViewX211_Rpt AS t ON t.PatientId=s.PatientId WHERE t.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, t.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate GROUP BY t.StudyStartDateTime ORDER BY t.StudyStartDateTime; 

Y la consulta final:

numStudiesPatientsByDate:

 SELECT s.StudyStartDateTime, s.numStudies, p.numPatients FROM numStudiesByDate AS s INNER JOIN numPatientsByDate AS p ON s.StudyStartDateTime = p.StudyStartDateTime; 

Gracias por toda la ayuda, y con suerte alguien más encuentra esto útil.