sql >> Database teknologi >  >> RDS >> Sqlserver

Skab bord 6 x 6 med automatisk spild fra upline

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




  1. Revision af dataændringer i SQL Server 2008

  2. PL/pgSQL kolonnenavn er det samme som variabel

  3. mysql_escape_string() funktion er forældet brug mysql_real_escape_string() Codeigniter

  4. Sammensat ELLER SQL-forespørgsel (forespørgsel #1 med WITH) og (forespørgsel #2) med COUNT() undskyldninger