分组SQL问题

字段ATTRIBUTE,按照3300-3305,3305-3310,3310-3315,3315-3320 进行分组,并求其频数,不在组中的频数为0,这种怎么写SQL,用case when 判断 最后求频率的时候不在区间内的数据,该区间就没有了,怎么能让区间还在频数为0。

select TO_NUMBER(x) as x,fz,count(fz) from (

select case when ATTRIBUTE2<'3295' then '<3295'

when ATTRIBUTE2>='3295' and ATTRIBUTE2<'3296' then '3295-3296'

 when ATTRIBUTE2>='3296' and ATTRIBUTE2<'3297' then '3296-3297'

 when ATTRIBUTE2>='3297' and ATTRIBUTE2<'3298' then '3297-3298'

 when ATTRIBUTE2>='3298' and ATTRIBUTE2<'3299' then '3298-3299'

 when ATTRIBUTE2>='3299' and ATTRIBUTE2<'3300' then '3299-3300'

 when ATTRIBUTE2>='3300'  then '>=3300'

 end as fz,

 case when ATTRIBUTE2<'3295' then '3294.5'

when ATTRIBUTE2>='3295' and ATTRIBUTE2<'3296' then '3295.5'

 when ATTRIBUTE2>='3296' and ATTRIBUTE2<'3297' then '3296.5'

 when ATTRIBUTE2>='3297' and ATTRIBUTE2<'3298' then '3297.5'

 when ATTRIBUTE2>='3298' and ATTRIBUTE2<'3299' then '3298.5'

 when ATTRIBUTE2>='3299' and ATTRIBUTE2<'3300' then '3299.5'

 when ATTRIBUTE2>='3300'  then '>=3300.5'

 end as x

 from 

(

SELECT 

equip_id,ATTRIBUTE2

FROM MT_DATA_RECORD_YZ_OCV1

WHERE 

equip_id='2680.1'

AND WORKCELL_ID ='58984.1'

AND TO_CHAR(record_date,'YYYYMMDDHH24')<= TO_CHAR(SYSdate,'YYYYMMDD')||'20'

AND TO_CHAR(record_date,'YYYYMMDDHH24')>= TO_CHAR(TO_CHAR(SYSdate,'YYYYMMDD')-1) ||'20'

ORDER BY tag_record_date desc )) group by fz,x

order by x

FineReport 帆软用户YbG5J0kkjo 发布于 2023-5-26 15:51 (编辑于 2023-5-26 17:07)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共1回答
最佳回答
0
CD20160914Lv8专家互助
发布于2023-5-26 15:53(编辑于 2023-5-26 15:55)

你把组的类型弄一个临时表,再关联业务表就行了

with tmp as (

select '3300-3305' as 编码  from dual

union all

select '3306-3310' as 编码  from dual

union all

select '3311-3315' as 编码 from dual

union all

select '3316-3320' as 编码 from dual

)

select a.编码,count(b.名称) as 个数 from tmp a left join 业务表 b on a.编码=b.编码

group by a.编码

  • 帆软用户YbG5J0kkjo 帆软用户YbG5J0kkjo(提问者) select TO_NUMBER(x) as x,fz,count(fz) from ( select case when ATTRIBUTE2<\'3295\' then \'<3295\' when ATTRIBUTE2>=\'3295\' and ATTRIBUTE2<\'3296\' then \'3295-3296\' when ATTRIBUTE2>=\'3296\' and ATTRIBUTE2<\'3297\' then \'3296-3297\' when ATTRIBUTE2>=\'3297\' and ATTRIBUTE2<\'3298\' then \'3297-3298\' when ATTRIBUTE2>=\'3298\' and ATTRIBUTE2<\'3299\' then \'3298-3299\' when ATTRIBUTE2>=\'3299\' and ATTRIBUTE2<\'3300\' then \'3299-3300\' when ATTRIBUTE2>=\'3300\' then \'>=3300\' end as fz, case when ATTRIBUTE2<\'3295\' then \'3294.5\' when ATTRIBUTE2>=\'3295\' and ATTRIBUTE2<\'3296\' then \'3295.5\' when ATTRIBUTE2>=\'3296\' and ATTRIBUTE2<\'3297\' then \'3296.5\' when ATTRIBUTE2>=\'3297\' and ATTRIBUTE2<\'3298\' then \'3297.5\' when ATTRIBUTE2>=\'3298\' and ATTRIBUTE2<\'3299\' then \'3298.5\' when ATTRIBUTE2>=\'3299\' and ATTRIBUTE2<\'3300\' then \'3299.5\' when ATTRIBUTE2>=\'3300\' then \'>=3300.5\' end as x from ( SELECT equip_id,ATTRIBUTE2 FROM MT_DATA_RECORD_YZ_OCV1 WHERE equip_id=\'2680.1\' AND WORKCELL_ID =\'58984.1\' AND TO_CHAR(record_date,\'YYYYMMDDHH24\')<= TO_CHAR(SYSdate,\'YYYYMMDD\')||\'20\' AND TO_CHAR(record_date,\'YYYYMMDDHH24\')>= TO_CHAR(TO_CHAR(SYSdate,\'YYYYMMDD\')-1) ||\'20\' ORDER BY tag_record_date desc )) group by fz,x order by x
    2023-05-26 15:59 
  • CD20160914 CD20160914 回复 帆软用户YbG5J0kkjo(提问者) 你的sql不要放在回复里面,放在最上面。。。你用我上面的语句,我是oracel的数据库做的测试。你把我上面写的业务表换成你的这一段就行了
    2023-05-26 16:01 
  • 帆软用户YbG5J0kkjo 帆软用户YbG5J0kkjo(提问者) 回复 CD20160914 老师您能帮我再看一下吗,我把SQL放上面了,一直报错。。
    2023-05-26 17:08 
  • CD20160914 CD20160914 回复 帆软用户YbG5J0kkjo(提问者) 现在报什么错误
    2023-05-26 21:51 
  • 2关注人数
  • 240浏览人数
  • 最后回答于:2023-5-26 17:07
    请选择关闭问题的原因
    确定 取消
    返回顶部