Это может быть проще всего сделать на стороне клиента, а не в базе данных, но если вы действительно это сделаете, я бы предположил, что самый простой способ распространения строк в 3 группы - использовать row_number() с modulo 3 и построить отдельные столбцы, используя это. Это прикажет строки немного по-другому:
A B C
D E F
G H
Если вам нужно иметь их в другом порядке, то вам нужно разделить row_number() с числом строк, разделенных на 3. Это вы получите их в порядок
A D G
B E H
C F
Пример:
select
max(case when GRP = 0 then VALUE end),
max(case when GRP = 1 then VALUE end),
max(case when GRP = 2 then VALUE end)
from
(
select
(row_number() over (order by VALUE)-1) % 3 as GRP,
(row_number() over (order by VALUE)-1)/3 as ROW,
VALUE
from table1
)X
group by ROW
Пример в SQL Fiddle
Редактирование: пример того, как разделить строки другим способом:
declare @NOLINES int
select @NOLINES = ceiling(count(*)/3.0) from table1
select
max(case when GRP = 0 then VALUE end),
max(case when GRP = 1 then VALUE end),
max(case when GRP = 2 then VALUE end)
from
(
select
(row_number() over (order by VALUE)-1)/@NOLINES as GRP,
(row_number() over (order by VALUE)-1) % @NOLINES as ROW,
VALUE
from table1
)X
group by ROW
Большое спасибо. Не могли бы вы привести еще один пример, чтобы показать строки другим способом, как в вопросе? – Ehab
Вам просто нужно иметь количество строк + свопинг по модулю и деление другим способом. Добавлен пример для этого. –
Работает отлично. Благодаря! – Ehab