SQL Server - get sum of values in a range -


i have table values this:

date(in ymd)            column1        column2 2013-08-08              0               6 2013-08-08              1               87 2013-08-08              2.8             23 2013-08-08              3.87            12 2013-08-08              0.111           65 2013-08-08              5               98 2013-08-08              7.876           67 2013-08-09              4.32            8 2013-08-09              4               2    2013-08-09              76.05           100 2013-08-09              32              9 

i want sum of column2 in range of column1 (i.e. add column2 values falls in column1 range). result this:

[0-1]               158 [1-2]               0 [2-3]               23 [3-4]               14 [4-5]               106 [5-6]               0 [6-7]               0 [7-8]               67 [8-9]               0 [10+]               109 

initially getting result below query , working fine.

        select [range], [totalsum]             (                 select                     case when column1 >= 0 , column1 <= 1 '[0-1]'                         when column1 > 1 , column1 <= 2 '[1-2]'                         when column1 > 2 , column1 <= 3 '[2-3]'                         when column1 > 3 , column1 <= 4 '[3-4]'                                       when column1 > 4 , column1 <= 5 '[4-5]'                         when column1 > 5 , column1 <= 6 '[5-6]'                         when column1 > 6 , column1 <= 7 '[6-7]'                         when column1 > 7 , column1 <= 8 '[7-8]'                         when column1 > 8 , column1 <= 9 '[8-9]'                         when column1 > 9 , column1 <= 10 '[9-10]'                                                         else '[10+]' end [range],                         sum(column2) [totalsum]                 dbo.table                       group                     case when column1 >= 0 , column1 <= 1 '[0-1]'                         when column1 > 1 , column1 <= 2 '[1-2]'                         when column1 > 2 , column1 <= 3 '[2-3]'                         when column1 > 3 , column1 <= 4 '[3-4]'                         when column1 > 4 , column1 <= 5 '[4-5]'                         when column1 > 5 , column1 <= 6 '[5-6]'                         when column1 > 6 , column1 <= 7 '[6-7]'                         when column1 > 7 , column1 <= 8 '[7-8]'                         when column1 > 8 , column1 <= 9 '[8-9]'                         when column1 > 9 , column1 <= 10 '[9-10]'                                         else '[10+]' end             ) t1                 order             case [range]                         when '[0-1]' 0                         when '[1-2]' 1                         when '[2-3]' 2                         when '[3-4]' 3                         when '[4-5]' 4                         when '[5-6]' 5                         when '[6-7]' 6                         when '[7-8]' 7                         when '[8-9]' 8                         when '[9-10]' 9                                         when '[10+]' 10             end 

now have requirement have apply filter, here eg "where date between '2013-08-09' , '2013-08-09' " though return correct values range data available i.e. [3-4], [4-5] , , [10+]

please can suggest there way range , show 0 in totalsum column there no rows range.

what changes should make in query show range values values in totalsum column(it should either 0 or sum of column2 range).

if other idea achieve this, please suggest. appreciated.

with cte (    select 0 rng_start, 1 rng_end    union    select       rng_end rng_start,       case when rng_end = 10 null else rng_end + 1 end rng_end    cte    rng_end <= 10 ), cte2 (    select        '[' + cast(c.rng_start nvarchar(max)) +        isnull('-' + cast(c.rng_end nvarchar(max)), '+') + ']' rng_str,        case when c.rng_start = 0 -1 else c.rng_start end rng_start,        c.rng_end    cte c ) select     c.rng_str,     isnull(sum(t.column2), 0) cte2 c     left outer join table1 t on         t.column1 > c.rng_start ,         (t.column1 <= c.rng_end or c.rng_end null) ,         t.[date] between '2013-08-09' , '2013-08-09'    group c.rng_str, c.rng_start order c.rng_start 

sql fiddle demo