Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo bảng 6 x 6 với tính năng tự động tràn từ tuyến trên

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chạy Tập lệnh, được thực hiện bằng cách tạo tập lệnh trên máy chủ khác nhau sẽ gây ra lỗi

  2. Làm thế nào để Chèn hàng loạt từ phần mở rộng tệp XLSX?

  3. Hiệu suất cơ sở dữ liệu chéo SQl 2008 trên cùng một máy vật lý và cùng một phiên bản máy chủ

  4. Khóa chính tự động tăng dần trong SQL Server Management Studio 2012

  5. Trả lại danh tính của hàng được chèn cuối cùng từ quy trình được lưu trữ