私たちは、あなたが望むデータを構築するために創造UNPIVOT
and PIVOT
を使用することができます。
は
declare @t table (ID int not null, Version int not null, Value1 varchar(20) null,
Value2 varchar(20) null, Value3 varchar(20) null)
insert into @t(ID,Version,Value1,Value2,Value3) values
(1,1,'Shaft',null,null),
(1,2,null,'steel','xy'),
(2,1,null,'Knife','somethins'),
(2,3,'Super',null,null)
;With Numberable as (
select *,ROW_NUMBER() OVER (PARTITION BY ID,Val ORDER BY Version desc) rn
from @t t
unpivot (tdata for Val in (Value1,Value2,Value3)) u
), Selected as (
select ID,tdata,Val
from Numberable where rn = 1
)
select
*
from Selected s
pivot (MAX(tdata) for Val in (Value1,Value2,Value3)) u
UNPIVOT
が自動的NULL
秒を削除します。 ROW_NUMBER()
は、保持したい値を識別します。 。我々は唯一たので(私はピボットでMAX
を使用していますが、それはただオプティマイザを満たすためだ
ID Value1 Value2 Value3
----------- -------------------- -------------------- --------------------
1 Shaft steel xy
2 Super Knife somethins
:PIVOT
は、私たちが望む最終的な結果を作成するようSelected
CTEは、我々が不要になった列を非表示にします各ID
、Val
組み合わせごとに1行を選択し、我々は多くても1つの値がピボットにより形成された格子の最後の位置)
に表示されるように選択されることを知っている上記Value1
という仮定を作るし、 Value2
およびValue3
は、すべて同じ、または少なくとも互換性のあるデータ型を持ちます。
あなたの現在のクエリの試行を見せてください! – jarlh
どのdbmsを使用しますか?それはDB scpecificすることができますか?適切なタグを追加してください – StanislavL
MS SQL、MS SQL Studioのクエリ – Volker