2013-08-23 30 views
2

我有一個表的值是這樣的:SQL服務器 - 獲取值的總和範圍

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 

我想在列1的範圍COLUMN2的總和(即增加其落在列1列2值範圍)。所以結果會是這樣的:

[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 

最初我得到這個結果與下面的查詢,它工作正常。

 SELECT [Range], [TotalSum] FROM 
      (
       SELECT 
        CASE WHEN Column1 >= 0 AND Column1 <= 1 THEN '[0-1]' 
         WHEN Column1 > 1 AND Column1 <= 2 THEN '[1-2]' 
         WHEN Column1 > 2 AND Column1 <= 3 THEN '[2-3]' 
         WHEN Column1 > 3 AND Column1 <= 4 THEN '[3-4]'    
         WHEN Column1 > 4 AND Column1 <= 5 THEN '[4-5]' 
         WHEN Column1 > 5 AND Column1 <= 6 THEN '[5-6]' 
         WHEN Column1 > 6 AND Column1 <= 7 THEN '[6-7]' 
         WHEN Column1 > 7 AND Column1 <= 8 THEN '[7-8]' 
         WHEN Column1 > 8 AND Column1 <= 9 THEN '[8-9]' 
         WHEN Column1 > 9 AND Column1 <= 10 THEN '[9-10]'         
         ELSE '[10+]' END [Range], 
         SUM(Column2) [TotalSum] 
       FROM dbo.table  
       GROUP BY 
        CASE WHEN Column1 >= 0 AND Column1 <= 1 THEN '[0-1]' 
         WHEN Column1 > 1 AND Column1 <= 2 THEN '[1-2]' 
         WHEN Column1 > 2 AND Column1 <= 3 THEN '[2-3]' 
         WHEN Column1 > 3 AND Column1 <= 4 THEN '[3-4]' 
         WHEN Column1 > 4 AND Column1 <= 5 THEN '[4-5]' 
         WHEN Column1 > 5 AND Column1 <= 6 THEN '[5-6]' 
         WHEN Column1 > 6 AND Column1 <= 7 THEN '[6-7]' 
         WHEN Column1 > 7 AND Column1 <= 8 THEN '[7-8]' 
         WHEN Column1 > 8 AND Column1 <= 9 THEN '[8-9]' 
         WHEN Column1 > 9 AND Column1 <= 10 THEN '[9-10]'     
         ELSE '[10+]' END 
      ) t1  
      ORDER BY 
      CASE [Range] 
         WHEN '[0-1]' THEN 0 
         WHEN '[1-2]' THEN 1 
         WHEN '[2-3]' THEN 2 
         WHEN '[3-4]' THEN 3 
         WHEN '[4-5]' THEN 4 
         WHEN '[5-6]' THEN 5 
         WHEN '[6-7]' THEN 6 
         WHEN '[7-8]' THEN 7 
         WHEN '[8-9]' THEN 8 
         WHEN '[9-10]' THEN 9     
         WHEN '[10+]' THEN 10 
      END 

現在我有一個要求,在那裏我有應用過濾器,這裏如說「凡之間‘2013年8月9日’和‘2013年8月9日’日期」 雖然這返回正確的值,但只適用於數據可用的範圍,即[3-4],[4-5]和[10+]

請你可以建議是否有一種方法來獲取所有範圍並在TotalSum中顯示0列中沒有該行的行。

我應該在這個查詢中做什麼改變,以顯示TotalSum列中值的所有範圍值(它應該是0或該範圍的column2的總和)。

如果您有任何其他想法來實現此目的,請提出建議。任何幫助將非常感激。

回答

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

sql fiddle demo

+0

感謝羅馬,但結果不是我想要的。當我在group by子句之前添加這一行時,在[2013-08-09 00:00:00.000'和'2013-08-09 00:00:00.000'之間的[日期] \t現在這隻顯示三行,我想所有的10行,即所有的範圍應該在那裏與值(它可以是0或列2的總和) – user1254053

+0

是的,你必須添加此條件加入 - 見更新的答案 –

+0

這工作完美!現在唯一的問題是範圍[0-1],這不顯示正確的總和。只有這個範圍的條件是不同的,並且對於所有其他範圍都是相同的。即對於[0-1]它應該是(> = 0和<= 1),對於休息它應該是(> 1和<= 2)。 「=」符號只出現在0的情況下,而不是其他的範圍值,否則這很好。你有什麼想法也可以在這個查詢中解決。已更新 – user1254053