SQL - получение итогов по кросс-таблице - PullRequest
0 голосов
/ 17 июня 2011
TRANSFORM Count(Research.Patient_ID) AS CountOfPatient_ID
SELECT DateDiff("yyyy",[DOB],Date()) AS [Age Group 22 - 24]
FROM (Research INNER JOIN Demographics ON Research.Patient_ID = Demographics.ID) INNER JOIN [Letter Status] ON Research.Patient_ID = [Letter Status].Patient_ID
WHERE (((DateDiff("yyyy",[DOB],Date())) Between 22 And 24))
GROUP BY DateDiff("yyyy",[DOB],Date())
PIVOT [Letter Status].Letter_Status;

В этом коде перечислены отдельные возрасты, но я хочу вычислить сумму всех возрастов, попадающих в этот диапазон. Таким образом, если бы было два 22-летних и один 23-летний, общее количество составило бы 3, в отличие от просмотра всех их возрастов в столбце ...

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

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

DateDiff("yyyy",[DOB],Date())

Если DOB = # 1987-12-31 #, на сегодняшнюю дату (# 2011-6-16 #), DateDiff даст вам это как возраст:

? DateDiff("yyyy", #1987-12-31#, #2011-6-16#)
 24 

(И фактически для любого DOB в 1987 году DateDiff с сегодняшней датой даст вам «возраст» 24 года. Кроме того, для любого DOB в 1987 году, используя этот метод в любой день 2011 года, вы получите 24).

OTOH, как обычно понимают возраст, можно сказать: "Чепуха! Его день рождения еще более чем через 6 месяцев. Сегодня ему всего 23 года".

Причина такого расхождения заключается в том, что DateDiff("yyyy" оценивает только компонент года двух дат. Рассмотрим эти две даты, которые разделены одним днем:

? DateDiff("yyyy",#2010-12-31#,#2011-1-1#)
 1

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

Чтобы вернуть возраст, как обычно понимается, вы можете использовать выражение, подобное этому:

? DateDiff("yyyy", #1987-12-31#, Date())+ _
            Int( Format(Date(), "mmdd") < Format( #1987-12-31#, "mmdd"))

Я скопировал это выражение из Access Web: Рассчитать возраст человека . На этой странице представлены другие подходы для определения возраста.

Ничего из этого не имеет значения, если, очевидно, как и ОП, вы хотите, чтобы все DOB в 1987 году считались 24 годами сегодня или в любой день 2011 года.

1 голос
/ 17 июня 2011

Вам необходимо определить возрастные диапазоны в инструкции switch.Чтобы упростить задачу, я создал встроенный запрос для расчета возраста (я предполагаю, что он указан в таблице исследований).

TRANSFORM Count(Research.Patient_ID) AS CountOfPatient_ID
SELECT  SWITCH (Age <= 22, "Under 22",
        Age > 22 and AGE <= 24 , "Between 22 And 24",
                Age > 24 and AGE <= 26,  "Between 24 And 26",
                Age > 26 , "Over 26") as Age_Range
FROM 
   (Research
    INNER JOIN (SELECT ID,  DateDiff("yyyy",DOB,Date()) as AGE
        FROM Demographics) Demographics
    ON Research.Patient_ID = Demographics.ID) 
    INNER JOIN [Letter Status] 
    ON Research.Patient_ID = [Letter Status].Patient_ID

GROUP BY  AGE


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