sql >> Database >  >> RDS >> Sqlserver

Tabel 6 x 6 maken met automatisch morsen van upline

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




  1. T-SQL Pivot/Unpivot (transponeren) kolomkoppen nodig als gegevensrijen

  2. Hoe kan ik mijn standaarddatabase in SQL Server wijzigen zonder MS SQL Server Management Studio te gebruiken?

  3. Een waarschuwing uitschakelen in sqlalchemy

  4. Verschil tussen schema / database in MySQL