Criar uma Matrix seria desnormalizar seus dados. Geralmente é uma prática recomendada NÃO para fazer isso, pois torna a manipulação de dados muito mais difícil, entre outros motivos. Como você impediria que as linhas fossem mais de 6? Você teria que adicionar uma restrição estranha assim:
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))
Aposto que você não está fazendo isso e, portanto, não pode "garantir" que não sejam inseridas mais de 6 linhas em sua tabela. Se você estiver fazendo isso, precisará inserir dados uma linha de cada vez que vai contra tudo o que o SQL Server trata. Isso seria para verificar se a primeira coluna está cheia ainda, então vá para o segundo, depois para o terceiro, etc... simplesmente não faz sentido.
Em vez disso, eu criaria um
ParentID
coluna para relacionar seus nomes à respectiva rede como você afirmou. Isso pode ser feito com uma coluna computada assim: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
Então, se você quiser exibi-lo em uma matriz você usaria
PIVOT()
, especificamente Pivot dinâmico
. Há muitos exemplos no Stack Overflow sobre como fazer isso. Isso também conta se você quiser que a matriz seja maior que 6 X N... talvez a rede cresça para que cada membro tenha 50 indivíduos... portanto 6 (linhas) X 51 (colunas) SE serão apenas 6 colunas, ou não muito mais, então você também pode usar uma lógica de junção simples ...
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
Você pode ver isso em ação com Esta DEMO on-line
Aqui estão algumas informações sobre normalização