Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь в нетривиальной группировке  [new]
Arsave
Member

Откуда: Волжский
Сообщений: 235
Есть таблица:

Тип Кол-во
11
21
21
11
61
41
41
61
81
11

Необходимо сгруппировать записи по типу, суммируя количество, с такими условиями:
1. Все существующие записи с типом 1 и 2 сгруппировать попарно, заменив при этом типом 3.
2. Остальные типы (включая 1 или 2, не вошедшие в пары) - просто просуммировать количество.

На выходе:

Тип Кол-во
34
62
42
81
11


скрипт:

declare @t table(Тип int, Количество int)
insert into @t
select 1, 1
union all
select 2, 1 
union all
select 2, 1 
union all
select 1, 1 
union all
select 6, 1 
union all
select 4, 1 
union all
select 4, 1 
union all
select 6, 1 
union all
select 8, 1 
union all
select 1, 1 

Спасибо.
_____________________________________
Access 2003 adp, MS SQL server 2005
18 окт 09, 12:11    [7801487]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
deto4ka
Member

Откуда: Пушкин
Сообщений: 215
;
WITH t_CTE (тип, количество)
AS
(
  select case Тип
   when 1 then 3
   when 2 then 3
  else Тип  end as 'тип', количество 
  from @t
)


select Тип, sum(Количество)
from t_CTE
group by Тип
Точка с запятой перед with - обязательно.
18 окт 09, 12:37    [7801520]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
Arsave
Member

Откуда: Волжский
Сообщений: 235
deto4ka,
спасибо, но результат не тот, что нужно
у Вас такой:
ТипКол-во
35
62
42
81

т.е. последняя запись исходного набора с типом 1 у Вас сгруппировалась с остальными, а исходя из условия должны получиться 2 пары с типом 1,2 и оставшаяся запись с типом 1, которой не нашлось записи с типом 2.
18 окт 09, 12:55    [7801548]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
По какому условию искать пару?
Если есть 4 записи типа 1 и две записи типа 2, то какие из записей типа 1 будут иметь пару, а какие нет?
18 окт 09, 13:09    [7801575]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
Arsave
Member

Откуда: Волжский
Сообщений: 235
trayal
По какому условию искать пару?
Если есть 4 записи типа 1 и две записи типа 2, то какие из записей типа 1 будут иметь пару, а какие нет?

Без разницы, в итоге должна получиться 1 запись типа 3 с количеством 4 и одна запись с типом 1 и количеством 2:
ТипКол-во
34
12
18 окт 09, 13:20    [7801589]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
То есть в каждой строке таблицы количество всегда одинаково и равно 1?
18 окт 09, 13:22    [7801593]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
Arsave
Member

Откуда: Волжский
Сообщений: 235
trayal
То есть в каждой строке таблицы количество всегда одинаково и равно 1?

Да, действительно, упустил из внимания.
Количество всегда равно 1.
18 окт 09, 13:26    [7801597]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
iljy
Member

Откуда:
Сообщений: 8711
Arsave,
сходу как-то так получилось.
declare @t table(Type int, Q int)
insert into @t
select 1, 1
union all
select 2, 1 
union all
select 2, 1 
union all
select 1, 1 
union all
select 6, 1 
union all
select 4, 1 
union all
select 4, 1 
union all
select 6, 1 
union all
select 8, 1 
union all
select 1, 1 

select Type, count(*)
from @t
where Type not in (1,2)
group by Type
	union all
select case x when 1 then case when c1>c2 then 1 else 2 end else 3 end,
	   case x when 1 then abs(c1-c2)
              else case when c1>c2 then c2 else c1 end end
from
(
	select count(case Type when 1 then 1 end) c1, count(case Type when 2 then 1 end) c2 from @t
) t1 cross join (select 1 x union all select 2) t2
18 окт 09, 13:48    [7801630]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
Arsave
Member

Откуда: Волжский
Сообщений: 235
iljy,
Большое Спасибо, работает.
Блин, меня удивляет, как у людей оперативки хватает, чтобы такое осилить? )))
18 окт 09, 14:50    [7801713]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в нетривиальной группировке  [new]
iljy
Member

Откуда:
Сообщений: 8711
Arsave
iljy,
Большое Спасибо, работает.
Блин, меня удивляет, как у людей оперативки хватает, чтобы такое осилить? )))


не за что учитесь разбивать задачу на части - вам надо посчитать количество для всех типов - одна часть, и посчитать количество пар и остаток - вторая часть.
18 окт 09, 16:22    [7801859]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить