マトリックスを作成すると、データが非正規化されます。通常は、しないことがベスト プラクティスです。 これを行うには、他の理由の中でもとりわけ、データ操作がはるかに困難になるためです。行が 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 行以下であることを「保証」することはできません。これを行っている場合は、一度に 1 行データを挿入する必要があります。 これは、SQL Server のすべてに反します。これは、最初の列が いっぱい かどうかを確認するためのものです それでも、次に 2 番目、3 番目などに移動します...意味がありません。
代わりに、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()
を使用します 、特に 動的ピボット
.これを行う方法については、スタック オーバーフローに多くの例があります。これは、マトリックスを 6 X N よりも大きくしたい場合にも考慮されます...おそらくネットワークが成長し、各メンバーが 50 個の個体を持ちます...したがって、6 (行) X 51 (列)
IF 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
このオンライン デモ で実際の動作を確認できます。