Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Criar tabela 6 x 6 com derramamento automático de upline


Criar uma Matrix seria desnormalizar seus dados. Geralmente é uma prática recomendada NÃO para fazer isso, pois torna a manipulação de dados muito mais difícil, entre outros motivos. Como você impediria que as linhas fossem mais de 6? Você teria que adicionar uma restrição estranha assim:
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))

Aposto que você não está fazendo isso e, portanto, não pode "garantir" que não sejam inseridas mais de 6 linhas em sua tabela. Se você estiver fazendo isso, precisará inserir dados uma linha de cada vez que vai contra tudo o que o SQL Server trata. Isso seria para verificar se a primeira coluna está cheia ainda, então vá para o segundo, depois para o terceiro, etc... simplesmente não faz sentido.

Em vez disso, eu criaria um ParentID coluna para relacionar seus nomes à respectiva rede como você afirmou. Isso pode ser feito com uma coluna computada assim:
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

Então, se você quiser exibi-lo em uma matriz você usaria PIVOT() , especificamente Pivot dinâmico . Há muitos exemplos no Stack Overflow sobre como fazer isso. Isso também conta se você quiser que a matriz seja maior que 6 X N... talvez a rede cresça para que cada membro tenha 50 indivíduos... portanto 6 (linhas) X 51 (colunas)

SE serão apenas 6 colunas, ou não muito mais, então você também pode usar uma lógica de junção simples ...
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

Você pode ver isso em ação com Esta DEMO on-line

Aqui estão algumas informações sobre normalização