sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa bord 6 x 6 med automatisk spill från upline

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




  1. Inkluderar värden som INTE FINNS i MySQL-frågeresultat

  2. Parser för Oracle SQL

  3. Hexsträng till heltalskonvertering i Amazon Redshift

  4. Phalcon - Hur gör jag en SELECT IN Subquery med Phalcon-modeller?