2

次のような値を持つテーブルがあります。

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

column1 の範囲で column2 の合計を取得したい (つまり、column1 の範囲にある column2 の値を追加する)。したがって、結果は次のようになります。

[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-08-09' と '2013-08-09' の間の日付」としますが、これは正しい値を返しますが、データが存在する範囲に対してのみです[3-4]、[4-5]、[10+]

すべての範囲を取得し、その範囲の行がない TotalSum 列に 0 を表示する方法があることを提案してください。

TotalSum 列の値を持つすべての範囲値を表示するには、このクエリでどのような変更を加える必要がありますか (その範囲の column2 の合計または 0 である必要があります)。

これを達成するための他のアイデアがあれば、提案してください。どんな助けでも大歓迎です。

4

1 に答える 1

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

于 2013-08-23T05:03:52.040 に答える