2009-07-02 3 views
0

У меня есть таблица (таблица переменная-факт), который содержит несколько тысяч (50k приблизительно) строк вида:Sql Server Row Concatenation

group (int) isok (bit) x y 
20   0    1 1 
20   1    2 1 
20   1    3 1 
20   0    1 2 
20   0    2 1 
21   1    1 1 
21   0    2 1 
21   1    3 1 
21   0    1 2 
21   1    2 2 

И вытащить это обратно к клиенту довольно изрядный (особенно потому, что isok немного). То, что я хотел бы сделать, это превратить это в форме:

group  mask 
20   01100 
21   10101 

А может быть, пойти еще дальше, кодируя это в длинную и т.д.

Примечание: Путь, в котором данные хранятся в настоящее время не может быть изменено.

Возможно ли подобное в SQL Server 2005 и, если возможно, даже 2000 (довольно важно)?

EDIT: Я забыл сделать это ясно, что исходная таблица уже в неявном упорядоченности, которая должна быть сохранена, там не один столбец, который действует как линейная последовательность, а упорядочение основывается на двух других столбцы (целые числа), как и выше (х & у)

+2

ли есть столбец, который заказывает биты? Потому что вы не гарантировали заказ без него, и ваши маски будут недействительными, если порядок важен. – Welbog

+0

Извините, вы должны были сделать это ясно и отредактировать - таблица для начала, но в настоящее время нет колонки с простой линейной последовательностью. –

+1

Нет таблиц «в порядке», это SQL, а не некоторый файл ISAM. У вас должен быть столбец заказа. Период. –

ответ

2

Вы можете относиться к биту в виде строки («0», «1») и развернуть один из методов агрегатных конкатенаций многих строк, описанных здесь: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

+0

Будет ли это работать, даже если для каждой группы есть тысячи строк? Благодарю. –

+0

Да, это преимущество. Если бы было не более 64 на группу, вы могли бы использовать побитовые операции bigint, но ничего больше, и вы должны использовать строку или varbinary. Но вам нужна колонка заказа. –