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

Crea una tabella 6 x 6 con fuoriuscita automatica dall'upline

La creazione di una matrice denormalizzerebbe i tuoi dati. Di solito è la migliore pratica NON per fare ciò, poiché, tra le altre ragioni, rende molto più difficile la manipolazione dei dati. Come impediresti che le righe siano più di 6? Dovresti aggiungere uno strano vincolo in questo modo:

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))

Scommetto che non lo stai facendo e quindi non puoi "assicurarti" che non siano inserite più di 6 righe nel tuo tavolo. In tal caso, dovresti inserire i dati una riga alla volta che va contro tutto ciò che riguarda SQL Server. Questo per verificare se la prima colonna è piena eppure, poi passa al secondo, poi al terzo, ecc... semplicemente non ha senso.

Invece, creerei un ParentID colonna per mettere in relazione i tuoi nomi con la rispettiva rete come hai affermato. Questo può essere fatto con una colonna calcolata in questo modo:

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

Quindi, se desideri visualizzarlo in una matrice useresti PIVOT() , in particolare Dynamic Pivot . Ci sono molti esempi su Stack Overflow su come farlo. Questo spiega anche se vuoi che la matrice sia più grande di 6 X N... forse la rete cresce in modo che ogni membro abbia 50 individui... quindi 6 (righe) X 51 (colonne)

SE saranno solo 6 colonne, o non molte di più, quindi puoi anche usare una semplice logica di join...

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

Puoi vederlo in azione con Questa DEMO online

Ecco alcune informazioni sulla normalizzazione