2016-01-24 5 views
0

У меня есть таблица материалов. Мне нужно заполнить форму ввода данных из этой таблицы.Распределите произвольные строки на нескольких столбцах

Проблема в том, что форма ввода данных разделена на несколько столбцов, каждая из которых содержит несколько материалов, как на картинке. enter image description here Как написать запрос выбора tsql для получения первой группы имен материалов в столбце, второй группы во второй столбец и так далее.

ответ

2

Это может быть проще всего сделать на стороне клиента, а не в базе данных, но если вы действительно это сделаете, я бы предположил, что самый простой способ распространения строк в 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 
+0

Большое спасибо. Не могли бы вы привести еще один пример, чтобы показать строки другим способом, как в вопросе? – Ehab

+0

Вам просто нужно иметь количество строк + свопинг по модулю и деление другим способом. Добавлен пример для этого. –

+0

Работает отлично. Благодаря! – Ehab

 Смежные вопросы

  • Нет связанных вопросов^_^