暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 根据年龄下限和上限以及年龄范围动态创建年龄组

askTom 2018-07-23
723

问题描述

嗨,

我有以下要求并寻求帮助以仅通过SQL实现此目的 (没有PL/SQL块)-

表A包含以下列-
1.员工身份
2.员工年龄
3.员工 _ 部门

最终用户需要提供以下3个提示值-

1.年龄上限 (例如18岁)
2.年龄下限 (例如55岁)
3.年龄差距 (例如7)

根据用户输入,SQL应该产生如下输出-

Age Band        Employee Count
------------------------------------------------------------
Under 18        8
18 - 24         11
25 - 31         11
32 - 38         15
39 - 45         14
46 - 52         15
53 - 54         4
55 Plus         71
复制


不应返回员工计数为0的记录。

如果需要任何进一步的信息,请告诉我。

请帮忙。

谢谢和问候,
Rituraj

专家解答

将人分组在界外很容易。只需检查年龄是否小于较低或大于或等于较高。

这之间的一点变得有趣 :)

您可以通过以下方式执行此操作:

1减去员工年龄 (22-18) 的下界 = 4
2除以间隙值 (4/7 ) = 0.56...
3采用分区法 (floor (0.56... ) = 0
4将此备份乘以 (0*7) = 0
5将下限加回 (0 18) = 18

要找到上限,请重复该过程。但是在步骤3中计算的地板上加一个。并且,由于上限可能是整个组的一部分,因此请最少返回此计算和上限。然后从结果中减去一个。

将以上所有内容粘贴在一个案例表达式中。并按其结果分组以获得计数。

All that remains is to get the rows in the correct order. 您可以通过以下方式执行此操作:

映射下...至-1。而其他值为0。按组值排序,例如:

  order  by case 
    when grp like 'U%' then -1
    else 0
  end, grp
复制


这给出了类似的东西:

with bounds as (
  select 18 lwr, 55 upr, 7 gap from dual
), grps as (
  select a.*,
         case
           when employee_age < lwr then 'Under ' || lwr
           when employee_age >= upr then upr || ' Plus'
           else to_char ( ( floor ( ( employee_age - lwr ) / gap ) * gap ) + lwr ) || '-' ||
                to_char ( 
                  least ( 
                    upr, 
                    ( ( floor ( ( employee_age - lwr ) / gap ) + 1 ) * gap ) + lwr  
                  ) - 1
                )
         end grp
  from   a cross join bounds
  order  by employee_age
)
  select grp, count (*), 
         min ( employee_age ), max ( employee_age ) 
  from   grps
  group  by grp
  order  by case 
    when grp like 'U%' then -1
    else 0
  end, grp;

GRP        COUNT(*)   MIN(EMPLOYEE_AGE)   MAX(EMPLOYEE_AGE)   
Under 18            8                12.5                17.5 
18-24              11                18.5                24.5 
25-31              11                25.5                31.5 
32-38              15               32.25                38.5 
39-45              14                39.5                45.5 
46-52              15               46.25                52.5 
53-54               4                53.5                54.5 
55 Plus            71                55.5               100.5 
复制


PS-请告诉我您不在表格中存储年龄!你是根据储存的出生日期来计算的,对吗?而且您不雇用8岁的孩子吗?;)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论