如何在Oracle数据库中使用SQL查询获取基于年龄组的人数?

如何在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

假设我有一个查询(这是我实际查询的一部分),它检索此人的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
 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
;