Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Създайте маса 6 x 6 с автоматично разливане от горната линия

Създаването на матрица би било денормализиране на вашите данни. Обикновено това е най-добрата практикаНЕ за да направите това, тъй като прави манипулирането на данни много по-трудно, наред с други причини. Как бихте предотвратили редовете да са повече от 6? Ще трябва да добавите странно ограничение като това:

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

Обзалагам се, че не правите това и по този начин не можете да "гарантирате", че в таблицата ви са вмъкнати не повече от 6 реда. Ако правите това, тогава ще трябва да вмъквате данни един ред наведнъж което противоречи на всичко, което представлява SQL Server. Това би трябвало да се провери дали първата колона е пълна все пак, след това преминете към втория, после към третия и т.н... просто няма смисъл.

Вместо това бих създал ParentID колона, за да свържат имената ви със съответната мрежа както казахте. Това може да се направи с изчислена колона по следния начин:

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

След това, ако искате да го покажете в матрица бихте използвали PIVOT() , по-специално Dynamic Pivot . В Stack Overflow има много примери как да направите това. Това също така отчита, ако искате матрицата да бъде по-голяма от 6 X N... може би мрежата се разраства, така че всеки член да има 50 индивида... следователно 6 (редове) X 51 (колони)

АКО ще има само 6 колони или не много повече, тогава можете също да използвате проста логика за присъединяване...

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

Можете да видите това в действие с Тази онлайн ДЕМО

Ето малко информация за нормализирането




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на многоетапна задача за агент на SQL Server (T-SQL)

  2. Кхмерски Unicode, английски и Microsoft SQL Server 2008 водят до въпросителни

  3. SQL заявка за разделяне на данните в колоните на редове

  4. EF4 - Избраната съхранена процедура не връща колони

  5. Добавете нова колона на таблица към конкретна редна позиция в Microsoft SQL Server