1


1

列/行による順序付けられた値

説明するのは少し難しいです。 例にスキップする方が簡単かもしれません。

テーブルにはidと4つの列があり、それぞれがnullを許可します。

ID, Col1, Col2, Col3, Col4

行の数はxです。 (通常4未満)そして、列全体で最大4つの異なる値のみが使用されます。

私は最大4行を返すことを探しています。結果セットの各行は基本的に列値であり、値は上部の列番号を保持して右から左に選択されます。 別の行に列固有でない値がある場合、それは次に使用可能な列にシフトされます。

例:

私が持っているならば:

ID, Col1, Col2, Col3, Col4
0,  A   , B   ,     , C
1,      ,     , D   ,

戻りたい

A
B
D
C

and

ID, Col1, Col2, Col3, Col4
0,  A   , B   , D   ,
1,  C   ,     ,     ,

与える

A
B
D
C

and

ID, Col1, Col2, Col3, Col4
0,  A   , B   , D   ,
1,  C   ,     ,     ,
2,  C   ,     ,     ,

与える

A
B
D
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

4 回答


2


Use:

SELECT DISTINCT COL1 AS col
  FROM YOUR_TABLE
 WHERE col1 IS NOT NULL
UNION
SELECT DISTINCT COL2 AS col
  FROM YOUR_TABLE
 WHERE col2 IS NOT NULL
UNION
SELECT DISTINCT COL3 AS col
  FROM YOUR_TABLE
 WHERE col3 IS NOT NULL
UNION
SELECT DISTINCT COL4 AS col
  FROM YOUR_TABLE
 WHERE col4 IS NOT NULL
ORDER BY col

UNIONはステートメント間の重複を削除します。 DISTINCTは、ステートメントごとに一意の値のリストを返します。 「UNION ALL」は「UNION」より高速ですが、重複は削除されません。


1


あなたが望んでいたとあなたが説明したすべてを理解できないかもしれません。 あなたの問題と他の人からのコメントを読んで、これがあなたが探しているものだと推測しています:

更新版:

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 cteOriginal
where id = (select MIN(tmp.id) from cteOriginal tmp where tmp.value = cteOriginal.value)
order by ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder])

最小のid、min(id)を持つ値を選択することで、重複する値を取り除きました。 max(id)を使用するように変更できます。

初期バージョン:

with cteOriginal as
(
    select *, RANK() over (partition by [column] order by id asc) as [NonUniqueSortOrder]
    from
    (
        select id, A as [value], 'A' as [Column], 1 as [SortOrder]
        from #original
        where A is not null
        union all
        select id, B as [value], 'B' as [Column], 2 as [SortOrder]
        from #original
        where B is not null
        union all
        select id, C as [value], 'C' as [Column], 3 as [SortOrder]
        from #original
        where C is not null
        union all
        select id, D as [value], 'D' as [Column], 4 as [SortOrder]
        from #original
        where D is not null
    ) as temp
)
select [value]
from cteOriginal
order by ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder])

ところで、このクエリにはmssql 2005を使用しています。 コメントしてください、私たちはそれを改良します。


0


select value from (
    select col1 as value from table_name where col1 is not null
     union
    select col2 as value from table_name where col2 is not null
     union
    select col3 as value from table_name where col3 is not null
     union
    select col4 as value from table_name where col4 is not null
) order by value


0


これを試してください

With MyTables as
(
SELECT  [Col1] as [ColX] FROM [Test].[dbo].[MyTable]
Union
SELECT  [Col2] as [ColX]   FROM [Test].[dbo].[MyTable]
Union
SELECT  [Col3] as [ColX]   FROM [Test].[dbo].[MyTable]
Union
SELECT  [Col4] as [ColX]   FROM [Test].[dbo].[MyTable]
)
select ColX from MyTables where ColX is not null