怎么样用一条sql语句实现这个问题

litsnake1 2006-06-26 12:51:37
现在要做统计,一张人员信息表id,name,age,....
统计小于30岁,小于40,小于50岁,大于50的人员数量

结果:
年龄段 人员数量
小于30岁 20
小于40 14
小于50岁 55
大于50 9

需要用一条语句,当然用union可以,但是有没有更好的方法,谢谢了
...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
s198127 2006-06-29
  • 打赏
  • 举报
回复
晕...yqwd911 ..还用在去嵌套一层吗??

直接就..

select case when age<30 then '<30'
when age>=30 and age <40 then '30-40'
when age>=40 and age <50 then '40-50'
else '>50' end ,
count(*)
from age
group by case when age<30 then '<30'
when age>=30 and age <40 then '30-40'
when age>=40 and age <50 then '40-50'
else '>50' end
可以老..
Nlg521 2006-06-26
  • 打赏
  • 举报
回复
哈哈!我误导得!下次注意简化啦!
litsnake1 2006-06-26
  • 打赏
  • 举报
回复
不错,靠,是啊,怎么没有想到呢
stone1126 2006-06-26
  • 打赏
  • 举报
回复
yqwd911的写法最优,感觉
SQL11 2006-06-26
  • 打赏
  • 举报
回复
yqwd911 的简化很多~~
看来我的绕了弯路~~~~
支持啊~
yqwd911 2006-06-26
  • 打赏
  • 举报
回复
你的年龄一定是去整的吗?
用这个SQl简单很多
select a,count(a)
from
(select (case when age<30 then '<30'
when age>=30 and age <40 then '30-40'
when age>=40 and age <50 then '40-50'
else '>50') a
from age)
group by a
stone1126 2006-06-26
  • 打赏
  • 举报
回复
都是牛人,我就不写了
xiaoxiao1984 2006-06-26
  • 打赏
  • 举报
回复
SQL> create table t2 (
2 id number,
3 name char(10),
4 age number);

表已创建。

SQL> begin
2 for i in 1.. 100 loop
3 insert into t2 values(i,'test'||to_char(i),20+i);
4 commit;
5 end loop;
6 end;
7 /

PL/SQL 过程已成功完成。

SQL> select decode(sign(age-50),-1,'小于50岁',0,'等于50岁',decode(sign(age-68),-
1,'小于68岁',0,'等于68岁','大于68岁')),
2 count(1) from t2 group by rollup(decode(sign(age-50),-1,'小于50岁',0,'等于5
0岁',decode(sign(age-68),-1,'小于68岁',0,'等于68岁','大于68岁')))
3 /

DECODE(S COUNT(1)
-------- ----------
大于68岁 52
等于50岁 1
等于68岁 1
小于50岁 29
小于68岁 17
100

已选择6行。
SQL11 2006-06-26
  • 打赏
  • 举报
回复
和Nlg521方法相同;
但是觉得Nlg521的sql有些问题:子分组查询中要使用count函数,否则相同的age将计算不准确.
Select
Case When a=1 Then '三十以下'
When a=2 Then '小于40'
When a=3 Then '小于50'
When a=4 Then '大于等于50' End ,
sum(b)
From (
Select Case When age<30 Then '1'
When age Between 30 And 39 Then '2'
When age Between 40 And 49 Then '3'
When age>=50 Then '4' End a ,
Count(age) b
From t_emp Group By age
) Group By a;
这样的写法很复杂~,希望高手能更好的方法
Nlg521 2006-06-26
  • 打赏
  • 举报
回复

SELECT
CASE f_Count
WHEN 1 THEN COUNT(*)
WHEN 2 THEN COUNT(*)
WHEN 3 THEN COUNT(*)
WHEN 4 THEN COUNT(*)
END AS f_UserCount ,
CASE f_Count
WHEN 1 THEN '三十以下'
WHEN 2 THEN '小于三十'
WHEN 3 THEN '小于四十'
WHEN 4 THEN '大于五十'
END AS f_TotalName
FROM
(
SELECT
CASE
WHEN f_Age < 30 THEN 1
WHEN f_Age >= 30 AND f_Age < 40 THEN 2
WHEN f_Age >= 40 AND f_Age < 50 THEN 3
WHEN f_Age >= 50 THEN 4
END AS f_Count
FROM t_Test GROUP BY f_Age
)
GROUP BY f_Count
litsnake1 2006-06-26
  • 打赏
  • 举报
回复
楼上兄弟,怎么实现
stone1126 2006-06-26
  • 打赏
  • 举报
回复
分析函数可以实现

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧