我试图编写一个查询,以基于多个不同范围来计数记录数。
我使用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
读取一个serialized
的serializeJSON
文件。因此,在数据库中,下面的所有内容都可以正常工作,但是对查询的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的逻辑。但是,以上逻辑错过了
15001
和30001
的值。我的猜测是,对于条件,OP实际上意味着col1 > 15000 and col1 <= 30000
和col1 > 30000 and col1 <= 45000
。但是,我没有更改它们,因为上面是原始问题的措辞方式(也许15001
和30001
有一些特殊之处)。