我试图编写一个查询,以基于多个不同范围来计数记录数。

我使用union成功,但是我觉得有更好的方法。

这是我所做的:

select count(col1) as range1
from tbl1
where col1 <= 15000
union
select count(col1) as range2
from tbl1
where col1 > 15001 and col1 <= 30000
union
select count(col1) as range3
from tbl1
where col1 > 30001 and col1 <= 45000
etc...

我正在使用sql server2008。如上所述,我很肯定有更好的方法来执行此操作,也许是这样的:sql count

编辑:是的,数据库是sql 2008,下面的答案完全根据需要工作。我忘了提一下,我实际上是在通过Coldfusion JSON读取一个serializedserializeJSON文件。因此,在数据库中,下面的所有内容都可以正常工作,但是对查询的Coldfusion查询不支持CASE语句,或者似乎不支持。

最佳答案

一种方法是使用条件求和(针对单独列中的值):

select sum(case when col1 <= 15000 then 1 else 0 end) as range1,
       sum(case when col1 > 15001 and col1 <= 30000 then 1 else 0 end) as range2,
       sum(case when col1 > 30001 and col1 <= 45000 then 1 else 0 end) as range3
from tbl1;

另一种方法是使用group by(用于单独行上的值):
select (case when col1 <= 15000 then 'range1'
             when col1 > 15001 and col1 <= 30000 then 'range2'
             when col1 > 30001 and col1 <= 45000 then 'range3'
             else 'other'
        end) as range, count(*) as cnt
from tbl1
group by (case when col1 <= 15000 then 'range1'
               when col1 > 15001 and col1 <= 30000 then 'range2'
               when col1 > 30001 and col1 <= 45000 then 'range3'
               else 'other'
          end);

我经常使用这种形式的子查询:
select range, count(*)
from (select t.*,
             (case when col1 <= 15000 then 'range1'
                   when col1 > 15001 and col1 <= 30000 then 'range2'
                   when col1 > 30001 and col1 <= 45000 then 'range3'
                   else 'other'
              end) as range
from tbl1
group by range;

这样,range的定义仅出现一次。

编辑:

以上全部使用来自OP的逻辑。但是,以上逻辑错过了1500130001的值。我的猜测是,对于条件,OP实际上意味着col1 > 15000 and col1 <= 30000col1 > 30000 and col1 <= 45000。但是,我没有更改它们,因为上面是原始问题的措辞方式(也许1500130001有一些特殊之处)。

10-08 03:56
查看更多