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

Откуда: Königsberg in Preußen
Сообщений: 79
Имеется таблица вида:

ID | CODE1 | CODE2
1 | 101 | a1
2 | 101 | s2
3 | 101 | s2
4 | 101 | v1
5 | 101 | b5
6 | 101 | a1
7 | 5550 | a1
8 | 5550 | d4
9 | 5550 | b1
10 | 5550 | v1
11 | 101 | a1
12 | 101 | s2
13 | 101 | s2
14 | 101 | b5
15 | 101 | v1
16 | 101 | a1

+ Исходная таблица
select '1' ID, '101' CODE1, 'a1' CODE2
union all
select '2', '101', 's2'
union all
select '3', '101', 's2'
union all
select '4', '101', 'v1'
union all
select '5', '101', 'b5'
union all
select '6', '101', 'a1'
union all
select '7', '5550', 'a1'
union all
select '8', '5550', 'd4'
union all
select '9', '5550', 'b1'
union all
select '10', '5550', 'v1'
union all
select '11', '101', 'a1'
union all
select '12', '101', 's2'
union all
select '13', '101', 's2'
union all
select '14', '101', 'b5'
union all
select '15', '101', 'v1'
union all
select '16', '101', 'a1'


Необходимо привести её к виду:

CODE1 | CODE2 | AMOUNT
101 | a1 | 2
101 | s2 | 2
101 | v1 | 1
101 | b5 | 1
5550 | a1 | 1
5550 | d4 | 1
5550 | b1 | 1
5550 | v1 | 1

+ Конечная таблица
select '101' CODE1, 'a1' CODE2, '2' AMOUNT
union all
select '101', 's2', '2'
union all
select '101', 'v1', '1'
union all
select '101', 'b5', '1'
union all
select '5550', 'a1', '1'
union all
select '5550', 'd4', '1'
union all
select '5550', 'b1', '1'
union all
select '5550', 'v1', '1'


Иными словами, необходимо свернуть таблицу по-строчно пока CODE1 не изменится. Внутри блоков строки суммируются по CODE2. В случае если повторно встречается блоки с уже отработанным CODE1 они пропускаются. Порядок строк в повторяющихся блоках может быть разным.
29 фев 12, 18:35    [12172796]     Ответить | Цитировать Сообщить модератору
 Re: По-блочно свернуть и просуммировать таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
Super_DJ,

declare @t table (ID int, CODE1 varchar(100), CODE2 varchar(100))
insert @t
select '1' ID, '101' CODE1, 'a1' CODE2
union all select '2', '101', 's2'
union all select '3', '101', 's2'
union all select '4', '101', 'v1'
union all select '5', '101', 'b5'
union all select '6', '101', 'a1'
union all select '7', '5550', 'a1'
union all select '8', '5550', 'd4'
union all select '9', '5550', 'b1'
union all select '10', '5550', 'v1'
union all select '11', '101', 'a1'
union all select '12', '101', 's2'
union all select '13', '101', 's2'
union all select '14', '101', 'b5'
union all select '15', '101', 'v1'
union all select '16', '101', 'a1'

select CODE1, CODE2, COUNT(*) cnt
from(
	select *, ROW_NUMBER() over(order by ID) RN, ROW_NUMBER() over(order by CODE1,ID) RA,
			 ROW_NUMBER() over(partition by CODE1,CODE2 order by ID) r
	from @t
)t
group by CODE1, RN-RA, CODE2
having min(r) = 1
order by MIN(ID)
29 фев 12, 19:07    [12172934]     Ответить | Цитировать Сообщить модератору
 Re: По-блочно свернуть и просуммировать таблицу  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Спасибо!
29 фев 12, 19:32    [12173012]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить