At oprette en matrix ville være at denormalisere dine data. Det er normalt bedste praksis IKKE at gøre dette, da det blandt andet gør datamanipulation meget vanskeligere. Hvordan vil du forhindre rækkerne i at være mere end 6? Du bliver nødt til at tilføje en mærkelig begrænsning som f.eks.:
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))
Jeg vil vædde på, at du ikke gør dette, og derfor kan du ikke "sikre" at der ikke er indsat mere end 6 rækker i din tabel. Hvis du gør dette, skal du indsætte data en række ad gangen hvilket går imod alt hvad SQL Server handler om. Dette ville være for at kontrollere, om den første kolonne er fuld alligevel, så flyt til den anden, så den tredje osv... det giver bare ikke mening.
I stedet ville jeg oprette et ParentID
kolonne for at relatere dine navne til deres respektive netværk som du sagde. Dette kan gøres med en beregnet kolonne som sådan:
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
Så, hvis du vil vise det i en matrix du ville bruge PIVOT()
, specifikt Dynamisk pivot
. Der er en masse eksempler på Stack Overflow på, hvordan man gør dette. Dette tager også højde for, hvis du ønsker, at matrixen skal være større end 6 X N... måske vokser netværket, så hvert medlem har 50 individer... altså 6 (rækker) X 51 (kolonner)
HVIS det bliver kun 6 kolonner, eller ikke mange flere, så kan du også bruge en simpel joinlogik...
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
Du kan se dette i aktion med Denne online DEMO
Her er nogle oplysninger om normalisering