求sql大佬帮忙提供下思路

Donsora 2019-01-21 06:51:57

这是通过其他表查询出的一个区间对应的等级,
现在通过另一些表统计出了用户的得分,
问题:现在我需要把所有用户得分根据这个区间统计出每个阶级有多少个用户,只用粗暴的sql,不考虑过程这些。
另外:如果能有不在区间范围内默认为某一个阶级。(脑子不够用了~)
最后,求大佬
...全文
1123 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mn11 2019-01-28
  • 打赏
  • 举报
回复
思路:先根据等级处理得分表,case when,分析出每一条得分的等级以及区间,然后将得到的结果集,根据等级group by count 就是你想要的结果,case when语法自己查一下,很简单...
纵马饮白虹 2019-01-25
  • 打赏
  • 举报
回复
咦,这个需求
首先查询区间表,然后在查询语句 select a, b, (select count(*) from table2 x where x.c >= a and x.c <= b) from table1
table1是区间表
table2是得分表
a是下限,b是上限,c是用户得分
这里如果是oracle 可以提前查询到table2的所有数据,之后查询条件从缓存中对比 减少查询消耗, mysql不知道有没有
  • 打赏
  • 举报
回复
刚在路上,不放便写,回来写了个测试。参考下


y表:
id grade
1 20
2 45
3 60
4 55
5 89
6 12
7 51
8 78
9 15
10 94
11 13



x表
grade gradeMinPoints gradeMaxPoints
1 0 30
2 31 60
3 61 80
4 81 100



select
sum(case when y.grade<x.gradeMaxPoints and y.grade>x.gradeMinPoints then 1 else 0 end) '人数',
x.grade '等级'
from x ,y
GROUP BY x.grade;

人数 等级
4 1
3 2
1 3
2 4
luj_1768 2019-01-24
  • 打赏
  • 举报
回复
select count from tbl where gradePoint >= 93.5; //for grade 1; select count from tbl where gradePoint >= 65 and gradePoint < 93.5; //for grade 2; //>=55 and < 65 for grade 3; >=45 and <55 for grade 4; <45 for grade 5.
  • 打赏
  • 举报
回复
我觉着吧可以用case when,………sum
xiao_lone 2019-01-23
  • 打赏
  • 举报
回复
xiao_lone 2019-01-23
  • 打赏
  • 举报
回复
select b.grade,b.min,b.max,count(1) as count from a_point a left join a_grade b on a.points <= b.max and a.points >= b.min group by b.grade; a_point表 字段 id points a_grade表 字段 grade min max
Donsora 2019-01-22
  • 打赏
  • 举报
回复
引用 4 楼 bcsflilong 的回复:
case when 语句
引用 3 楼 Timor_D 的回复:
不知道你具体的表示是什么,sql就不写了,你去看下case when 函数就知道怎么用了 不难。
SELECT grade,gradeMinPoints,gradeMaxPoints FROM .......(这里查询出等级和对应的区间结果集) SELECT avgPoints FROM .......(这里查询出每个用户的得分) case avgPoints >gradeMinPoints and avgPoints<=gradeMaxPoints then ????(这后面该怎么呢) 我想达到的效果就是 grade | min | max | count 1 | 0 | 50 | 23 2 | 51 | 70 | 42 就是在每个区间后面统计出这个分数段的人数。额,有点晕
nayi_224 2019-01-22
  • 打赏
  • 举报
回复
如果区间是动态生成的,那就没case when什么事了
select t1.gd, decode(t1.gd, 'outer', count(1) - count(t2.id), count(t2.id))

  from (select '1' gd, 93 mi, 100 ma
          from dual
        union all
        select '2' gd, 80 mi, 93 ma
          from dual
        union all
        select '3' gd, 70 mi, 80 ma
          from dual
        
        union all
        select 'outer', null, null from dual) t1

  left join (select 1 id, 95 score
               from dual
             union all
             select 1 id, 95 score
               from dual
             union all
             select 2 id, 300 score from dual) t2 on (t1.ma >= t2.score and
                                                     t1.mi < t2.score)
group by t1.gd
                                                     ;
oracle写的,mysql可能要小改一下。
bcsflilong 2019-01-22
  • 打赏
  • 举报
回复
case when 语句
Timor_D 2019-01-22
  • 打赏
  • 举报
回复
不知道你具体的表示是什么,sql就不写了,你去看下case when 函数就知道怎么用了 不难。
Donsora 2019-01-21
  • 打赏
  • 举报
回复
引用 1 楼 老鼠拧刀满街找猫 的回复:
oracle?
喔,不好意思,忘了说 是mysql
  • 打赏
  • 举报
回复
oracle?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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