Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Utwórz stół 6 x 6 z automatycznym przelewaniem z linii upline

Stworzenie macierzy oznaczałoby denormalizację danych. Zwykle jest to najlepsza praktyka NIE w tym celu, ponieważ między innymi znacznie utrudnia to manipulację danymi. Jak możesz zapobiec sytuacji, w której liczba wierszy przekracza 6? Musisz dodać dziwne ograniczenie, takie jak:

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

Założę się, że tego nie robisz i dlatego nie możesz „zapewnić” wstawienia do stołu nie więcej niż 6 wierszy. Jeśli to robisz, musisz wstawiać dane jeden wiersz na raz co jest sprzeczne ze wszystkim, o co chodzi w SQL Server. Byłoby to sprawdzenie, czy pierwsza kolumna jest pełna ale potem przejdź do drugiego, potem trzeciego itd... to po prostu nie ma sensu.

Zamiast tego utworzyłbym ParentID kolumna, aby powiązać twoje nazwiska z odpowiednią siecią jak powiedziałeś. Można to zrobić za pomocą kolumny obliczeniowej w następujący sposób:

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

Następnie, jeśli chcesz wyświetlić go w macierzy użyjesz PIVOT() , w szczególności Dynamiczny przestaw . Istnieje wiele przykładów na Stack Overflow, jak to zrobić. Dotyczy to również sytuacji, gdy macierz ma być większa niż 6 X N... być może sieć rośnie tak, że każdy członek ma 50 osób... czyli 6 (wiersze) X 51 (kolumny)

JEŚLI będzie to tylko 6 kolumn lub niewiele więcej, możesz też użyć prostej logiki łączenia...

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

Możesz to zobaczyć w akcji dzięki Tej demonstracji online

Oto kilka informacji na temat normalizacji




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. serwer sql wykonuje się jako błędy uprawnień w wyzwalaczu

  2. Aktualizacja konta pocztowego bazy danych w programie SQL Server (T-SQL)

  3. Tworzenie Entity Framework Model obejmuje wiele baz danych

  4. Kompresowanie pola tekstowego w Sql Server 2k8 R2

  5. szukać słowa kluczowego we wszystkich przechowywanych procedurach dla danego DB?