2013-09-24 2 views
1

на моем SQL Server я получил следующую таблицу - упрощенный:SQL GROUP BY различными значениями одного coloumn

year month category value 
2009 9  1   10 
2009 9  2   20 
2009 9  3   40 
...  ...  ...   ... 

Теперь я хочу, чтобы группа по годам, месяцам и категории (1 + 2, 3, .. .), так что мой результат выглядит следующим образом:

year month category value 
2009 9  1+2   30 
2009 9  3   40 
...  ...  ...   ... 

Внести изменения в таблицу нельзя. Кроме того, важно, чтобы SQL выполнялся быстро ...

Как сделать эту группу? Я не мог найти что-нибудь полезным еще ...

Спасибо за вашу помощь ...

+1

И как вы определяете, какие категории должны быть агрегированы? Или это всегда 1 и 2? –

+0

это всегда 1 + 2 и так далее ... – dotnetsharp

ответ

4
with cte as (
    select 
     year, month, value, 
     case 
      when category in (1, 2) then '1+2' 
      else cast(category as varchar(max)) 
     end as category 
    from Table1 
) 
select 
    year, month, category, sum(value) 
from cte 
group by year, month, category 

или

select 
    t.year, t.month, isnull(c.category, t.category), sum(value) 
from Table1 as t 
    left outer join (values 
     (1, '1+2'), 
     (2, '1+2') 
    ) as c(id, category) on c.id = t.category 
group by t.year, t.month, isnull(c.category, t.category) 

sql fiddle demo

+0

О, извините, возможно, было непонятно ... в категории coloumn больше скоплений, таких как 1 + 2, 3 + 4, 5 + 6, 7 + 8 +9 Нет ли шанса сделать это без вспомогательного стола ?! – dotnetsharp

+0

Мне нравится вспомогательный стол. Чище, чем решение UNION, я не публиковал ... –

1

Я нашел это более легко понять сам, а также может быть легко реализован в sqlite

SELECT 
    t.year, 
    t.month, 
    (CASE WHEN t.category = 1 OR t.category = 2 THEN '1+2' ELSE t.category END) as category, 
    sum(value) AS value 
FROM table_name AS t 
GROUP BY (CASE WHEN t.category = 1 OR t.t.category = 2 THEN '1+2' ELSE t.category END)