説明するのは少し難しいです。例にスキップする方が簡単かもしれません。列/行による順序付け値
テーブルには、それぞれがnullを許可するIDと4つの列があります。
ID, Col1, Col2, Col3, Col4
x個の行があります。 (通常は4未満)列全体で最大4つの異なる値が使用されます。
結果セットの各行は、基本的に、値が最初から左から選択されている列の値であり、最初のCol値を保持しているところから4行戻ってきます。他の行の値が列に固有でない場合は、次に使用可能な列に移動します。
例:
私が持っている場合:
ID, Col1, Col2, Col3, Col4
0, A , B , , C
1, , , D ,
私は
A
B
D
C
と
がID, Col1, Col2, Col3, Col4
0, A , B , D ,
1, C , , ,
を与える返したいです
A
B
D
C
と
ID, Col1, Col2, Col3, Col4
0, A , B , D ,
1, C , , ,
2, C , , ,
A
B
D
C
感謝を与えます!値の間にユニークな列とスペースがない場合のシナリオを投げ捨てることができます。
これは発生しません。
CREATE TABLE #original (id int ,A INT, B INT, C INT, D INT);
INSERT INTO #original
--SELECT 0,1,2,null,4
--union
--select 1,null,null,3,null
--
--
--SELECT 0,1,2,3,null
--union
--select 1,4,null,null,null
--
--
SELECT 0,1,2,4,null
union
select 1,3,null,null,null
union
select 2,3,null,null,null
select * from #original order by id asc;
with cteOriginal as
(
select *, RANK() over (partition by [SortOrder] order by id asc) as [NonUniqueSortOrder]
from
(
select id, A as [value], 1 as [SortOrder]
from #original
where A is not null
union all
select id, B as [value], 2 as [SortOrder]
from #original
where B is not null
union all
select id, C as [value], 3 as [SortOrder]
from #original
where C is not null
union all
select id, D as [value], 4 as [SortOrder]
from #original
where D is not null
) as temp
)
select [value] from
(
select top 50 [value], ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder]) sortedOrder
from cteOriginal
order by sortedOrder
) tmp
group by [value]
order by min(sortedOrder)
DROP TABLE #original
これらの潜在的なソリューションが返す与えられた最初の例として動作しませんでした B D C – TrevDev
私はそれがどこから来た何行/列の詳細気にして私がコラムで発注するべきではありません。 – TrevDev
あなたはSQL Serverを扱っているように見えます。バージョンも含めてください。 –