Возрастной диапазон группировки в Access 2010

У меня есть таблица клиента с ClientID (PK) и полем DOB с датой / временем в качестве типа данных. Мне нужно создать запрос для тренировки возрастных групп, например:

Age Group  Count

18 – 24      2
25 - 35      1
36 - 45      2
46 - 55      5
56 - 65      0
66+          2
Not stated   5
Total        17

Я получил следующий запрос sql:

SELECT DISTINCT Partition(DateDiff("yyyy",[DOB],Date())(DateSerial(Year(Date()),Month([DOB]),Day([DOB]))>Date()),19,66,8) AS Range, 
Count(ClientsDetails.ClientID) AS CountOfAgeGroups
FROM ClientsDetails
GROUP BY Partition(DateDiff("yyyy",[DOB],Date())+(DateSerial(Year(Date()),Month([DOB]),Day([DOB]))>Date()),19,66,8);

И это дает следующий результат:

Range    CountOfAgeGroup   
:18      1
27:34    4
35:42    1
67:      1    

Может, кто-нибудь подскажет мне, какие изменения я должен внести в запрос, или, возможно, посоветую лучшее решение для достижения желаемого результата, так как я не слишком знаком с Access.

Заранее спасибо.

Это вторая часть моего запроса. Можно ли также найти возрастную группу между двумя датами с помощью параметра поиска. Например, если я хочу найти возрастную группу между 01.01.14 и 17.03.14. Я попробовал следующее, используя решение, опубликованное Гордом Томпсоном, но оно выдает ошибку неправильного выражения:

SELECT [%$##@_Alias].AgeGroup, Count(*) AS CountOfAgeGroup, Support.ClientID
FROM (SELECT Switch([Age] Between 18 And 24, "18-24", [Age] Between 25 And 35, "25-35", [Age] Between 36 And 45, "36-45", [Age] Between 46 And 55, "46-55",[Age] Between 56 And 65,  "56-65",[Age] > 66, "66+") AS AgeGroup FROM (SELECT DateDiff("yyyy",[DOB],Date())-IIf(Format(Date(),"mmdd")<Format([DOB],"mmdd"),1,0) AS Age FROM ClientsDetails)  AS [%$##@_Alias])  AS [%$##@_Alias], Support
GROUP BY [%$##@_Alias].AgeGroup,Support.ClientID
HAVING (((Support.ClientID) Between [Enter Start Date] And [Enter End Date]));

1 ответ

Решение

Если мы начнем с запроса, который вычисляет фактический возраст в годах (на основе поля [Date_of_Birth] и Date()функция)

SELECT 
    DateDiff("yyyy",[Date_of_Birth],Date())-IIf(Format(Date(),"mmdd")<Format([Date_of_Birth],"mmdd"),1,0) AS Age
FROM Students

тогда мы можем использовать это как подзапрос и применить Switch() функция (ссылка: здесь), чтобы назначить [AgeGroup] для каждой записи

SELECT
    Switch([Age] Between 0 And 17, "0-17", [Age] Between 18 And 24, "18-24", [Age] Between 25 And 35, "25-35", [Age] > 35, "Over 35") AS AgeGroup
FROM
    (
        SELECT 
            DateDiff("yyyy",[Date_of_Birth],Date())-IIf(Format(Date(),"mmdd")<Format([Date_of_Birth],"mmdd"),1,0) AS Age
        FROM Students
    )

а затем обернуть все это в запросе агрегации

SELECT
    AgeGroup,
    Count(*) AS CountOfAgeGroup
FROM
    (
        SELECT
            Switch([Age] Between 0 And 17, "0-17", [Age] Between 18 And 24, "18-24", [Age] Between 25 And 35, "25-35", [Age] > 35, "Over 35") AS AgeGroup
        FROM
            (
                SELECT 
                    DateDiff("yyyy",[Date_of_Birth],Date())-IIf(Format(Date(),"mmdd")<Format([Date_of_Birth],"mmdd"),1,0) AS Age
                FROM Students
            )
    )
GROUP BY AgeGroup

чтобы получить такие результаты

AgeGroup  CountOfAgeGroup
--------  ---------------
0-17                    5
18-24               12897
25-35                3537
Over 35               766
Другие вопросы по тегам