Tạo Ma trận sẽ không chuẩn hóa dữ liệu của bạn. Cách tốt nhất thường là KHÔNG để làm điều này, vì nó làm cho việc thao tác dữ liệu trở nên khó khăn hơn rất nhiều, trong số các lý do khác. Bạn làm cách nào để ngăn các hàng nhiều hơn 6? Bạn sẽ phải thêm một ràng buộc kỳ lạ như vậy:
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))
Tôi cá là bạn không làm điều này và do đó, bạn không thể "đảm bảo" không có quá 6 hàng được chèn vào bảng của mình. Nếu bạn đang làm điều này, thì bạn phải chèn dữ liệu từng hàng một điều này đi ngược lại với mọi thứ SQL Server nói về. Điều này sẽ để kiểm tra xem cột đầu tiên đã đầy chưa tuy nhiên, sau đó chuyển sang thứ hai, rồi thứ ba, v.v. ... nó không có ý nghĩa.
Thay vào đó, tôi sẽ tạo một ParentID
để liên kết tên của bạn với mạng tương ứng của họ như bạn đã nêu. Điều này có thể được thực hiện với một cột được tính toán như sau:
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
Sau đó, nếu bạn muốn hiển thị nó trong ma trận bạn sẽ sử dụng PIVOT()
, cụ thể là Dynamic Pivot
. Có rất nhiều ví dụ trên Stack Overflow về cách thực hiện việc này. Điều này cũng giải thích nếu bạn muốn ma trận lớn hơn 6 X N ... có lẽ mạng phát triển nên mỗi thành viên có 50 cá nhân ... do đó 6 (hàng) X 51 (cột)
NẾU nó sẽ chỉ có 6 cột hoặc không nhiều hơn, khi đó bạn cũng có thể sử dụng một logic nối đơn giản ...
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
Bạn có thể thấy điều này đang hoạt động với DEMO trực tuyến này
Đây là một số thông tin về chuẩn hóa