2010-01-16 71 views
0

说如果我有一个2列 - ID,金钱的表。 我想做一个查询,以找出多少ID有钱少于100,200,300,...,10000 我应该如何在SQL Server中做到这一点?我需要使用变量吗?在SQL Server中积累计数

回答

0

有时很简单,以使用循环中的存储过程:

CREATE TABLE #tmp0(
bucket int, 
accumulator int, 
) 

/* for(n = maxvalue; n > 0; n -= 100) */ 

Declare @n int 
select @n = (select 100 + (100 * (max(moneyField)/100)) from tbl) 
while @n > 0 
begin 
    insert into #tmp0 (bucket, accumulator) 
     (select @n, count(*) from tbl where moneyField < @n) 
    select @n = @n - 100 
end 
select * from #tmp0 order by bucket 

drop table #tmp0 
1

假设ID是一个键柱,尝试:

Select Case When money < 100 Then 'LT100' 
      When money < 200 Then 'From100To199' 
      When money < 300 Then 'From200To299' 
      When money < 1000 Then 'From300To999' 
           Else 'GE1000' End Bucket, 
     Count(*) Count 
From Table 
Group By Case When money < 100 Then 'LT100' 
      When money < 200 Then 'From100To199' 
      When money < 300 Then 'From200To299' 
      When money < 1000 Then 'From300To999' 
           Else 'GE1000' End 

编辑: 如果桶的长度或大小是常数,(或可被表示为一个SQL表达式),则可以做通过定义桶作为表达式的输出,如在,例如,以限定每$ 100美元桶的桶中的任何任意数目:

Select Str(Floor(Cast(money/100)), 8, 0) Bucket, 
     Count(*) Count 
From Table 
Group By Str(Floor(Cast(money/100)), 8, 0) 

,或者有100个美元水桶高达1000 $,然后$ 1000从那里起水桶:

Select Case When Money < 1000 
      Then Str(Floor(Cast(money/100)), 8, 0) 
      Else Str(Floor(Cast(money/1000)), 8, 0) End Bucket, 
     Count(*) Count 
From Table 
Group By Case When Money < 1000 
      Then Str(Floor(Cast(money/100)), 8, 0) 
      Else Str(Floor(Cast(money/1000)), 8, 0) End 

获得累积计数,我会使用上面的SQL querys的输出作为另一个SQL子查询: 使用第一个为例:

Select LT100, 
     LT100 + From100To199 LT200, 
     LT100 + From100To199 + From200To299 LT300, 
     LT100 + From100To199 + From200To299 + From300To999 LT1000, 
     LT100 + From100To199 + From200To299 + From300To999 + GE1000 Total  
    From (Select Case When money < 100 Then 'LT100' 
       When money < 200 Then 'From100To199' 
       When money < 300 Then 'From200To299' 
       When money < 1000 Then 'From300To999' 
            Else 'GE1000' End Bucket, 
      Count(*) Count 
     From Table 
     Group By Case When money < 100 Then 'LT100' 
       When money < 200 Then 'From100To199' 
       When money < 300 Then 'From200To299' 
       When money < 1000 Then 'From300To999' 
            Else 'GE1000' End) Z 
+0

谢谢回答。如果范围从0到1000000000?然后我必须输入10,000,000次“当金钱<....”的声明。有没有更有效的方法来做到这一点? 顺便说一句,这个问题是要求计算累计计数。所以这将是0-100计数,0-200计数,0-300等... – Stan 2010-01-17 17:36:46

+0

添加调整处理年问题...并做累计数现在.. – 2010-01-17 19:49:51

0
SELECT 
    SUM(CASE WHEN MONEY < 100 THEN 1 ELSE 0 END AS '0-100' 
    ,SUM(CASE WHEN MONEY >= 100 AND MONEY < 200 THEN 1 ELSE 0 END AS '100-200' 
    ,SUM(CASE WHEN MONEY >= 200 AND MONEY < 300 THEN 1 ELSE 0 END AS '200-300' 
FROM 
    Table