SQL Создание сохраненного процесса для возврата возрастных групп - PullRequest
4 голосов
/ 12 мая 2009

У меня есть таблица с именем Person, которая содержит поле с именем PersonAge. Мне нужно сгруппировать возрасты по возрастным группам, то есть '12 и младше', '13 -17 ', '18 -25', '25 и старше 'и вернуть этот набор результатов, используя хранимую процедуру.

В идеале мне нужно вернуть 2 поля, «Возрастной диапазон», «Всего», как это

Age band         Total 
12 and under     5
13 - 17          8
18 - 25          7
25 and over      10

Ответы [ 5 ]

13 голосов
/ 12 мая 2009

Создайте таблицу, содержащую ваши группы:

CREATE TABLE agebands
(
    id INT NOT NULL PRIMARY KEY,
    lower_bound INT NOT NULL,
    upper_bound INT NOT NULL
)
CREATE INDEX IDX_agebands_bounds ON (lower_bound, upper_bound)

Затем заполните его своими данными:

INSERT INTO agebands VALUES (1, 0, 12)
INSERT INTO agebands VALUES (2, 13, 17)
INSERT INTO agebands VALUES (3, 18, 24)
INSERT INTO agebands VALUES (4, 25, 199)

Тогда присоединяйтесь к нему:

SELECT
    lower_bound, upper_bound,
    COUNT(*) AS number_of_people
FROM
    persons
    INNER JOIN agebands
        ON person_age BETWEEN lower_bound AND upper_bound
GROUP BY
    lower_bound, upper_bound
ORDER BY
    lower_bound

Это позволяет гибко настраивать полосы. Конечно, другой ответ, использующий UNION, также пригоден для использования, что более уместно, если вы можете / не будете добавлять другую таблицу в свою базу данных.

4 голосов
/ 12 мая 2009

Достаточно простого СОЮЗА.

SELECT [Ageband] = '12 and under', COUNT(*)
FROM dbo.Person
WHERE PersonAge <= 12
UNION ALL SELECT '13-17', COUNT(*)
FROM dbo.Person
WHERE PersonAge BETWEEN 13 AND 17
UNION ALL SELECT '18-25', COUNT(*)
FROM dbo.Person
WHERE PersonAge BETWEEN 18 AND 25
UNION ALL SELECT '26 and over', COUNT(*)
FROM dbo.Person
WHERE PersonAge >= 26
2 голосов
/ 12 мая 2009

Должно дать следующее:

select count(*), person_age
from (
    select (case 
               when age between 0 and 12 then '12 and under'
               when age between 13 and 17 then '13-17'
               when age between 18 and 25 then '18-15'
               else 'Above 25'
            end) as 'person_age'
    from person)
group by person_age
1 голос
/ 13 мая 2009

В SQL нельзя группировать по псевдониму столбца. Вам нужно будет повторить инструкцию case следующим образом.

select count(*), 
case  
    when aged between 0 and 12 then '12 and under'
    when aged between 13 and 17 then '13-17'
    when aged between 18 and 25 then '18-15'
    else 'Above 25' end
from person
group by 
case  
    when aged between 0 and 12 then '12 and under'
    when aged between 13 and 17 then '13-17'
    when aged between 18 and 25 then '18-15'
    else 'Above 25'
end
0 голосов
/ 12 мая 2009
declare @tempT table(age int)
declare @temp2 table(age2 varchar(15))

insert into @tempT(age) values(1)
insert into @tempT(age) values(2)
insert into @tempT(age) values(3)
insert into @tempT(age) values(4)
insert into @tempT(age) values(5)
insert into @tempT(age) values(6)
insert into @tempT(age) values(7)
insert into @tempT(age) values(8)
insert into @tempT(age) values(9)
insert into @tempT(age) values(10)
insert into @tempT(age) values(11)

insert into @Temp2
select  case  
when age < 3 then '<3'
when age >= 3 and age < 5 then '>= 3 and < 5'
when age >= 5 then '>=5'
end
from @tempT

select count(*), age2 from @Temp2 
GROUP BY age2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...