Access 2007: «ВЫБЕРИТЕ СЧЕТ - PullRequest
       7

Access 2007: «ВЫБЕРИТЕ СЧЕТ

1 голос
/ 26 августа 2009

У меня есть таблица, которая содержит StudyId, PatientId и StudyStartDateTime. Я хотел бы отобразить итоги исследований и пациентов между двумя датами, указанными пользователем. Проблема заключается в подсчете различных значений. Вот запрос:

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. Я знаю, что Access не поддерживает COUNT (DISTINCT ...), но у меня много проблем с этим. Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

1 голос
/ 26 августа 2009

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

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

1 голос
/ 26 августа 2009

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

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

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;

Обратите внимание, что я добавил подсчитанные поля в выражения GROUP BY в каждом.

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

0 голосов
/ 26 августа 2009

Я принял предложение 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 голосов
/ 26 августа 2009

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

Запись количественного (различного) запроса в Access

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