Het maken van een matrix zou uw gegevens denormaliseren. Het is meestal de beste gewoonte NIET om dit te doen, omdat het onder andere het manipuleren van gegevens een stuk moeilijker maakt. Hoe zou je voorkomen dat de rijen meer dan 6 zijn? Je zou een rare beperking moeten toevoegen, zoals:
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))
Ik wed dat je dit niet doet, en dus kun je er niet voor zorgen dat er niet meer dan 6 rijen in je tabel worden ingevoegd. Als u dit doet, moet u gegevens rij voor rij . invoegen wat indruist tegen alles waar SQL Server over gaat. Dit zou zijn om te controleren of de eerste kolom vol is toch, ga dan naar de tweede, dan de derde, enz... het heeft gewoon geen zin.
In plaats daarvan zou ik een ParentID
. maken kolom om uw namen te relateren aan hun respectievelijke netwerk zoals je zei. Dit kan worden gedaan met een berekende kolom als volgt:
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
Als u het vervolgens in een matrix . wilt weergeven je zou PIVOT()
. gebruiken , in het bijzonder Dynamic Pivot
. Er zijn veel voorbeelden op Stack Overflow over hoe u dit kunt doen. Dit geldt ook als je wilt dat de matrix groter is dan 6 X N... misschien groeit het netwerk zodat elk lid 50 individuen heeft... dus 6 (rijen) X 51 (kolommen)
ALS het zijn maar 6 kolommen, of niet veel meer, dan kun je ook een eenvoudige join-logica gebruiken...
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
Je kunt dit in actie zien met Deze online DEMO
Hier is wat informatie over normalisatie