如何在Oracle数据库中使用SQL查询获取基于年龄组的人数?
假设我有一个查询(这是我实际查询的一部分),它检索此人的person\u id和年龄:如何在Oracle数据库中使用SQL查询获取基于年龄组的人数?,sql,oracle,Sql,Oracle,假设我有一个查询(这是我实际查询的一部分),它检索此人的person\u id和年龄: select p.person_id,TRUNC ((SYSDATE - p.birth_date) / 365.25, 0) AS age from person p 现在,在达到这个年龄后,我想得到每个年龄组的人数,如: group count age <=5 100 age >5 and age <=10 50 a
select p.person_id,TRUNC ((SYSDATE - p.birth_date) / 365.25, 0) AS age
from person p
现在,在达到这个年龄后,我想得到每个年龄组的人数,如:
group count
age <=5 100
age >5 and age <=10 50
age > 10 15
... ...
因此,结果应该是:
group count
age < =5 1
>5 & <=10 3
> 10 2
组计数
年龄<=51岁
>5 & 10 2
首先,您的年龄计算不正确。几乎可以肯定的是,你想测量两个日期之间的月份,而不是希望除以365.25就足够了
trunc( months_between( sysdate, p.birth_date )/ 12 )
其次,如果要按范围分组,只需在case
语句中选择范围并按该范围分组
SELECT (case when age <= 5
then 'age <= 5'
when age > 5 and age <= 10
then 'age > 5 and age <= 10'
else 'age > 10'
end) bucket,
count(*)
FROM( SELECT trunc( months_between( sysdate, p.birth_date )/ 12 ) age
FROM person p )
GROUP BY (case when age <= 5
then 'age <= 5'
when age > 5 and age <= 10
then 'age > 5 and age <= 10'
else 'age > 10'
end)
SELECT(5岁和年龄时的案例),假设您已经计算了年龄值。您可以使用case表达式和按不同年龄组分组
比如说,
SQL> WITH data(person_id, age) AS(
2 SELECT 1, 3 FROM dual UNION ALL
3 SELECT 2, 4 FROM dual UNION ALL
4 SELECT 3, 8 FROM dual UNION ALL
5 SELECT 4, 9 FROM dual UNION ALL
6 SELECT 5, 15 FROM dual UNION ALL
7 SELECT 6, 25 FROM dual UNION ALL
8 SELECT 7, 32 FROM dual UNION ALL
9 SELECT 8, 44 FROM dual UNION ALL
10 SELECT 9, 67 FROM dual UNION ALL
11 SELECT 10, 75 FROM dual
12 )
13 SELECT (
14 CASE
15 WHEN age <= 5
16 THEN 'age <= 5'
17 WHEN age > 5 AND age <= 10
18 THEN 'age > 5 and age <= 10'
19 WHEN age > 10 AND age <= 30
20 THEN 'age > 10 and age <= 30'
21 ELSE 'age > 30'
22 END) age_group,
23 COUNT(*)
24 FROM data
25 GROUP BY (
26 CASE
27 WHEN age <= 5
28 THEN 'age <= 5'
29 WHEN age > 5 AND age <= 10
30 THEN 'age > 5 and age <= 10'
31 WHEN age > 10 AND age <= 30
32 THEN 'age > 10 and age <= 30'
33 ELSE 'age > 30'
34 END)
35 /
AGE_GROUP COUNT(*)
---------------------- ----------
age <= 5 2
age > 10 and age <= 30 2
age > 5 and age <= 10 2
age > 30 4
SQL>
SQL>,数据(个人id、年龄)为(
2从“双联管全部”中选择1、3
3从双联轴节全部中选择2、4
4从“双联管全部”中选择3、8
5从“双联管所有”中选择4、9
6从双联轴节全部中选择5、15
7从双联轴节全部中选择6、25
8从双联轴节全部中选择7、32
9从双联轴节全部中选择8、44
10从dual UNION ALL中选择9、67
11从双通道中选择10、75
12 )
13选择(
14例
15岁,5岁和10岁,10岁和
如果您没有年龄组范围,则可以使用解码对确切的年龄进行硬编码。您可能需要执行以下操作:
with data as (
select p.person_id,TRUNC ((SYSDATE - p.birth_date) / 365.25, 0) AS age
from person p
)
select '30 or below' as stat, sum(case when age between 0 and 30 then 1 else 0 end) as count from data
union all
select '31 to 60' as stat, sum(case when age between 31 and 60 then 1 else 0 end) as count from data
union all
select '31 to 130' as stat, sum(case when age between 31 and 130 then 1 else 0 end) as count from data
;
示例:请提供一些示例数据?可以是sql FIDLE语句,也可以是create和insert语句。示例数据意味着我可以随机提供此人的id和年龄。您还需要什么?示例数据意味着发布数据,以便有人可以使用它来构建查询。发布几行,即create table和insert语句。
with data as (
select p.person_id,TRUNC ((SYSDATE - p.birth_date) / 365.25, 0) AS age
from person p
)
select '30 or below' as stat, sum(case when age between 0 and 30 then 1 else 0 end) as count from data
union all
select '31 to 60' as stat, sum(case when age between 31 and 60 then 1 else 0 end) as count from data
union all
select '31 to 130' as stat, sum(case when age between 31 and 130 then 1 else 0 end) as count from data
;