Créer une matrice reviendrait à dénormaliser vos données. C'est généralement la meilleure pratique PAS pour ce faire, car cela rend la manipulation des données beaucoup plus difficile, entre autres raisons. Comment empêcheriez-vous les lignes d'être plus de 6 ? Il faudrait ajouter une contrainte bizarre comme celle-ci :
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))
Je parie que vous ne faites pas cela, et donc, vous ne pouvez pas "vous assurer" que pas plus de 6 lignes sont insérées dans votre table. Si vous faites cela, vous devrez insérer les données une ligne à la fois ce qui va à l'encontre de tout ce qu'est SQL Server. Ce serait pour vérifier si la première colonne est pleine encore, puis passez au deuxième, puis au troisième, etc... ça n'a tout simplement pas de sens.
Au lieu de cela, je créerais un ParentID
colonne pour relier vos noms à leur réseau respectif comme vous l'avez indiqué. Cela peut être fait avec une colonne calculée comme ceci :
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
Ensuite, si vous vouliez l'afficher dans une matrice vous utiliseriez PIVOT()
, en particulier Pivot dynamique
. Il existe de nombreux exemples sur Stack Overflow sur la façon de procéder. Cela tient également compte si vous voulez que la matrice soit plus grande que 6 X N... peut-être que le réseau se développe de sorte que chaque membre compte 50 individus... donc 6 (lignes) X 51 (colonnes)
SI il n'y aura que 6 colonnes, ou pas beaucoup plus, alors vous pouvez aussi utiliser une simple logique de jointure...
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
Vous pouvez voir cela en action avec Cette DÉMO en ligne
Voici quelques informations sur la normalisation