Создание матрицы приведет к денормализации ваших данных.Обычно это лучше всего делать НЕ , так как это усложняет манипулирование данными, в том числе и по другим причинам.Как бы вы помешали строкам быть больше 6?Вам нужно добавить странное ограничение, например, так:
create table #matrix ( ID int identity(1,1),
Name1 varchar(64),
Name2 varchar(64),
Name3 varchar(64),
Name4 varchar(64),
Name5 varchar(64),
Name6 varchar(64),
CONSTRAINT ID_PK PRIMARY KEY (ID),
CONSTRAINT Configuration_SixRows CHECK (ID <= 6))
Держу пари, что вы этого не делаете, и, таким образом, вы не можете «гарантировать», что не более 6 строк вставлено втвой стол.Если вы делаете это, то вам придется вставлять данные по одной строке за раз , что противоречит всему, что есть в SQL Server.Это было бы для проверки, если первый столбец полный еще, затем перейти ко второму, затем к третьему, и т. Д ... это просто не имеет смысла.
Вместо этого ясоздаст столбец ParentID
, чтобы связать ваши имена с их сетью , как вы заявили.Это можно сделать с помощью вычисляемого столбца, например:
declare @table table (ID int identity(1,1),
Names varchar(64),
ParentID as case
when ID <= 6 then null
else replace(ID % 6,0,6)
end)
insert into @table
values
('John')
,('Peter')
,('Mary')
,('Lary')
,('Anderson')
,('Paul')
,('Seven')
,('Eight')
,('Nine')
,('Ten')
,('Eleven')
,('Twelve')
,('Thirteen')
,('Fourteen')
select * from @table
Затем, если вы хотите отобразить его в матрице , вы должны использовать PIVOT()
, в частности Dynamic Pivot.На Stack Overflow есть много примеров того, как это сделать.Это также учитывает, если вы хотите, чтобы матрица была больше, чем 6 X N ... возможно, сеть растет, так что у каждого участника есть 50 человек ... таким образом, 6 (строки) X 51 (столбцы)
ЕСЛИ это будет только 6 столбцов или не намного больше, тогда вы также можете использовать простую логику соединения ...
select
t.ID
,t.Names
,t2.Names
,t3.Names
from @table t
left join
@table t2 on t2.ParentID = t.ID and t2.ID = t.ID + 6
left join
@table t3 on t3.ParentID = t.ID and t3.ID = t.ID + 12
--continue on
where
t.ParentID is null
Вы можете увидеть это в действии с Это OnLine DEMO
Вот некоторая информация о нормализации