sql >> Base de Datos >  >> RDS >> Sqlserver

Crear mesa 6 x 6 con derrame automático desde la línea ascendente

Crear una Matrix sería desnormalizar sus datos. Por lo general, es la mejor práctica NO para ello, ya que dificulta mucho la manipulación de datos, entre otras razones. ¿Cómo evitarías que las filas fueran más de 6? Tendrías que agregar una restricción extraña como esta:

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

Apuesto a que no está haciendo esto y, por lo tanto, no puede "garantizar" que no se inserten más de 6 filas en su tabla. Si está haciendo esto, entonces tendría que insertar datos una fila a la vez lo que va en contra de todo lo que se trata de SQL Server. Esto sería para verificar si la primera columna está llena sin embargo, luego pasa al segundo, luego al tercero, etc... simplemente no tiene sentido.

En su lugar, crearía un ParentID columna para relacionar sus nombres con su respectiva red como dijiste. Esto se puede hacer con una columna calculada así:

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

Luego, si desea mostrarlo en una matriz usarías PIVOT() , específicamente Dynamic Pivot . Hay muchos ejemplos en Stack Overflow sobre cómo hacer esto. Esto también explica si desea que la matriz sea más grande que 6 X N... tal vez la red crezca para que cada miembro tenga 50 personas... por lo tanto, 6 (filas) X 51 (columnas)

SI solo serán 6 columnas, o no muchas más, entonces también puede usar una lógica de unión simple...

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

Puede ver esto en acción con Esta DEMO en línea

Aquí hay información sobre la normalización