Sql 如何在Oracle中查询列值的分布(按值范围分组)?

Sql 如何在Oracle中查询列值的分布(按值范围分组)?,sql,oracle,Sql,Oracle,假设Oracle中有一个名为distance的表,其中有一个名为distance的浮点型列。距离的范围为[0,1000]。我想知道距离的分布,例如,以下每个范围中有多少行:0,10]、10,50]、50,100]、100,500]。。。5000,10000] 如何构建此SQL查询?使用派生表将每个距离放入其组中。然后分组并计数: 请理想地显示表的完整定义,因为create table sql工作正常。还有一个问题,如果我想同时知道每个组的百分比呢?我不是Oracle用户,但我认为他们在这方面有很

假设Oracle中有一个名为distance的表,其中有一个名为distance的浮点型列。距离的范围为[0,1000]。我想知道距离的分布,例如,以下每个范围中有多少行:0,10]、10,50]、50,100]、100,500]。。。5000,10000]


如何构建此SQL查询?

使用派生表将每个距离放入其组中。然后分组并计数:


请理想地显示表的完整定义,因为create table sql工作正常。还有一个问题,如果我想同时知道每个组的百分比呢?我不是Oracle用户,但我认为他们在这方面有很好的功能。无论如何,在ANSI SQL中,只需将count 100.0/select count*从距离添加到选择列表中即可。
select dist_group, count(*)
from
(
 select case when distance between 0  and 10 then '(0, 10)'
             when distance between 10 and 50 then '(10, 50)'
             ...
             when distance between 5000 and 10000 then '(5000, 10000)' end as dist_group
 from distances
)
group by dist_group
SELECT COUNT( CASE WHEN   0 <= distance AND distance <=   10 THEN distance END ) AS in_range_0_10,
       COUNT( CASE WHEN  10 <  distance AND distance <=   50 THEN distance END ) AS in_range_10_50,
       COUNT( CASE WHEN  50 <  distance AND distance <=  100 THEN distance END ) AS in_range_50_100,
       COUNT( CASE WHEN 100 <  distance AND distance <=  500 THEN distance END ) AS in_range_100_500,
       COUNT( CASE WHEN 500 <  distance AND distance <= 1000 THEN distance END ) AS in_range_500_1000
FROM   Distance;