Att skapa en matris skulle avnormalisera dina data. Det är vanligtvis bästa praxis INTE att göra detta, eftersom det bland annat gör datamanipulation mycket svårare. Hur skulle du förhindra att raderna blir fler än 6? Du måste lägga till en konstig begränsning som så:
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))
Jag slår vad om att du inte gör detta, och därför kan du inte "se till" att inte mer än 6 rader infogas i ditt bord. Om du gör detta måste du infoga data en rad i taget vilket går emot allt SQL Server handlar om. Detta skulle vara för att kontrollera om den första kolumnen är full ändå, flytta sedan till den andra, sedan den tredje, etc... det är helt enkelt inte vettigt.
Istället skulle jag skapa ett ParentID
kolumn för att relatera dina namn till deras respektive nätverk som du sa. Detta kan göras med en beräknad kolumn så här:
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
Sedan, om du vill visa den i en matris du skulle använda PIVOT()
, närmare bestämt Dynamisk pivot
. Det finns många exempel på Stack Overflow på hur man gör detta. Detta står också för om du vill att matrisen ska vara större än 6 X N... kanske nätverket växer så att varje medlem har 50 individer... alltså 6 (rader) X 51 (kolumner)
OM det kommer bara att vara 6 kolumner, eller inte många fler, sedan kan du också använda en enkel logik för koppling...
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 detta i aktion med Denna online-DEMO
Här är lite information om normalisering