sql >> Databáze >  >> RDS >> Sqlserver

Vytvořte stůl 6 x 6 s automatickým přeléváním z horní linie

Vytvoření matice by znamenalo denormalizaci vašich dat. Obvykle je to nejlepší postup NE k tomu, protože to kromě jiných důvodů značně ztěžuje manipulaci s daty. Jak byste zabránili tomu, aby řádky byly více než 6? Museli byste přidat podivné omezení, jako je toto:

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

Vsadím se, že to neděláte, a proto nemůžete „zajistit“, aby do vaší tabulky nebylo vloženo více než 6 řádků. Pokud to děláte, pak byste museli vkládat data po jednom řádku což jde proti všemu, o čem SQL Server je. To by znamenalo zkontrolovat, zda je první sloupec plný přesto se přesuňte na druhý, pak na třetí atd... prostě to nedává smysl.

Místo toho bych vytvořil ParentID sloupec pro spojení vašich jmen s jejich příslušnou sítí jak jste uvedl. To lze provést pomocí vypočítaného sloupce takto:

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

Pak, pokud byste jej chtěli zobrazit v matici byste použili PIVOT() , konkrétně Dynamic Pivot . Na Stack Overflow je spousta příkladů, jak to udělat. To také odpovídá, pokud chcete, aby matice byla větší než 6 X N... možná se síť rozroste, takže každý člen má 50 jedinců... tedy 6 (řádky) x 51 (sloupce)

KDYŽ bude to pouze 6 sloupců, nebo ne o mnoho více, pak můžete také použít jednoduchou logiku spojení...

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

Můžete to vidět v akci pomocí tohoto online DEMO

Zde je několik informací o normalizaci




  1. Počítání nových zákazníků za měsíc

  2. jak uložit data, která uživatel zadá na stránce formuláře po provedení skriptu?

  3. Nelze se připojit k RDS mysql DB z Wordpress na Amazon linux EC2 instance

  4. Nemůžete se připojit k serveru SQL Server 2008?