Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen Sie einen Tisch 6 x 6 mit automatischem Überlauf von der Upline

Das Erstellen einer Matrix würde Ihre Daten denormalisieren. Dies ist normalerweise die beste Vorgehensweise NICHT dies zu tun, da dies unter anderem die Datenmanipulation erheblich erschwert. Wie würden Sie verhindern, dass die Zeilen mehr als 6 sind? Sie müssten eine seltsame Einschränkung wie folgt hinzufügen:

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

Ich wette, Sie tun dies nicht und können daher nicht "sicherstellen", dass nicht mehr als 6 Zeilen in Ihre Tabelle eingefügt werden. In diesem Fall müssten Sie Daten zeilenweise einfügen was gegen alles spricht, worum es bei SQL Server geht. Dies wäre, um zu prüfen, ob die erste Spalte voll ist doch, dann gehe zum zweiten, dann zum dritten, etc... es macht einfach keinen Sinn.

Stattdessen würde ich eine ParentID erstellen Spalte, um Ihre Namen mit ihrem jeweiligen Netzwerk in Verbindung zu bringen wie du gesagt hast. Dies kann mit einer berechneten Spalte wie folgt erfolgen:

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

Dann, wenn Sie es in einer Matrix anzeigen möchten Sie würden PIVOT() verwenden , insbesondere Dynamic Pivot . Es gibt viele Beispiele auf Stack Overflow, wie man das macht. Dies gilt auch, wenn Sie möchten, dass die Matrix größer als 6 x N ist ... vielleicht wächst das Netzwerk, sodass jedes Mitglied 50 Personen hat ... also 6 (Zeilen) x 51 (Spalten)

WENN es werden nur 6 Spalten sein, oder nicht viel mehr, dann kannst du auch eine einfache Verknüpfungslogik verwenden...

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

Sie können dies in Aktion mit dieser OnLine-DEMO sehen

Hier finden Sie einige Informationen zur Normalisierung