2009-08-25 2 views
1

У меня есть таблица, содержащая StudyId, PatientId и StudyStartDateTime. Я хотел бы рассчитать итоги исследований и пациентов между двумя датами, указанными в . пользователь проблема с подсчетом различных значений Вот запрос:..Access 2007: «SELECT COUNT (DISCTINCT ...»

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; 

Этот запрос работает почти как следует, за исключением того, что он считает дубликаты строк с одинаковой StudyId или же PatientId Я знаю, что доступ не поддерживает COUNT (DISTINCT ...), но у меня много проблем с этим. Любая помощь будет очень оценена.

+0

Вопрос: Являются ли данные, хранящиеся в таблице JET, или они проходят через SQL (что открывает больше опций)? – JohnFx

+0

Данные изначально хранятся в SQL Server 2005. Для целей разработки я сбросил данные и импортировал их в Access. В идеале я предполагаю, что интерфейс Access сможет работать независимо от того, является ли источником данных Сервер или дамп, импортированный в Access. – Richard

ответ

1

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

Если вы открыты для делать это в двух запросов вместо одного, это будет работать:

, что я добавил подсчитанные полей в GROUP BY выражения в каждом
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; 

Примечание.

Если вы хотите сделать его более «компактным», вы можете создать представление для каждого из этих запросов и присоединить их к отдельному запросу StudyStartDateTime, чтобы получить результаты в одном наборе результатов.

+0

Но как это подсчет различных строк? – Richard

+0

Отдельные строки? Ваш вопрос задает различные значения в PatiendID и StudyID. Отдельные строки - это еще одна проблема. – JohnFx

1

Отмечено dbo_ префикс - связано ли это с базой данных SQL Server?

Если это так, вы можете использовать сквозной запрос и использовать синтаксис COUNT (DISTINCT ...), поскольку он будет передаваться непосредственно SQL Server.

+0

Это, но, к сожалению, он также должен работать с копиями Access-only. – Richard

0

Подставляя это в отдельный ответ, поэтому он может быть на голосование самостоятельно, но этот блог статья говорит о делает это с подзапрос подход:

Writing a Count(Distinct) Query in Access

+0

Это была первая статья, которую я нашел, а также. До сих пор я не мог включить этот подход.Я думаю, что проблема возникает из-за того, что, хотя у него есть только одно значение, которое должно быть разным, у меня два. – Richard

+0

Чтобы добавить к моему предыдущему комментарию, проблема в том, что, поскольку он имеет только один столбец, который должен быть различным, ему не нужно беспокоиться о присоединении к этому двум отдельным запросам SELECT DISTINCT. – Richard

+0

Трюк будет состоять в том, чтобы присоединиться к двум затянутым таблицам (подзапросам) вместо одного. Один для каждого подсчета (по сути, два вопроса, которые я поставил в другом ответе) – JohnFx

0

Я принял предложение JohnFx, и я ве создали эти два подзапроса:

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; 

И последний вопрос:

numStudiesPatientsByDate:

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

Спасибо за всю помощь, и, надеюсь, кто-то считает, что это полезно!

+0

Даже если вы изменили его предложение, разве вы не должны давать ему кредит на ответ? –