SQL - UNION: как UNION 4 ВЫБРАТЬ несопоставленный столбец по Order By - PullRequest
0 голосов
/ 03 марта 2020
SELECT 'ABC-D Header1' As Seq1
UNION
SELECT 'ABC-D Header2' AS seq2
UNION
SELECT  ABC-D data1 data2..3..data4 ' AS seq3
UNION
SELECT 'ABC-D Tail' AS Seq4
ORDER BY SEQ1 ASC

 OUTPUT:  
 ABC-D data1 data2..3..data4
 ABC-D Header1
 ABC-D Header2     
 ABC-D Tail

EXPECTED RESULT :

ABC-D Header1
ABC-D Header2
ABC-D data1 data2..3..data4
ABC-D Tail

Может ли кто-нибудь помочь мне, как UNION работает внутри, я имею дело с жестко закодированными значениями, которые должны быть в двух строках (Header1, Header2), за которыми следуют данные и часть Tail. Я также попробовал AS C и DES C, но, похоже, ничего не дает точного результата.

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

3 голосов
/ 03 марта 2020

Вы можете использовать VALUES с позицией:

SELECT t.Header
FROM ( VALUES (1, 'ABC-D Header1'), 
              (2, 'ABC-D Header2'), 
              (3, 'ABC-D data1 data2..3..data4 '), 
              (4, 'ABC-D Tail'))
     ) t(Seq, Header)
ORDER BY seq;
2 голосов
/ 03 марта 2020

добавить еще один столбец для требуемого заказа

SELECT 'ABC-D Header1' As Seq1, s = 1
UNION
SELECT 'ABC-D Header2' AS seq2, s = 2
UNION
SELECT  'ABC-D data1 data2..3..data4 ' AS seq3, s = 3
UNION
SELECT 'ABC-D Tail' AS Seq4, s = 4
ORDER BY s ASC

РЕДАКТИРОВАТЬ: Если вы не хотите sh, чтобы получить s в результате, используйте cte или derived table

; WITH CTE AS
(
    SELECT 'ABC-D Header1' As Seq1, s = 1
    UNION
    SELECT 'ABC-D Header2' AS seq2, s = 2
    UNION
    SELECT  'ABC-D data1 data2..3..data4 ' AS seq3, s = 3
    UNION
    SELECT 'ABC-D Tail' AS Seq4, s = 4
)
SELECT  Seq1
FROM    CTE
ORDER BY s ASC
1 голос
/ 03 марта 2020

Это тоже один из способов сделать это. С unpivot.

select seq from 
(select convert(varchar(50), 'ABC-D Header1') as seq1
        , convert(varchar(50), 'ABC-D Header2') as seq2
        , convert(varchar(50),'ABC-D data1 data2..3..data4') as seq3
        , convert(varchar(50),'ABC-D Tail') as seq4) a
unpivot (seq for seq_order in ([seq1], [seq2], [seq3], [seq4])
) as b

здесь приведена демоверсия

. Использовался convert, так как без него была выдана ошибка, что seq3 конфликтует с типом других столбцов, указанных в списке UNPIVOT

Результат :

enter image description here

1 голос
/ 03 марта 2020
select Seq1
from
(
SELECT 'ABC-D Header1' As Seq1, number = 1
UNION
SELECT 'ABC-D Header2' AS seq2, number = 2
UNION
SELECT  'ABC-D data1 data2..3..data4 ' AS seq3, number = 3
UNION
SELECT 'ABC-D Tail' AS Seq4, number = 4
) a 
ORDER BY number ASC

Или вы также можете использовать Desired table таким образом, без лишних столбцов

SELECT Seq1
FROM(
 VALUES
 ('ABC-D Header1'),
 ('ABC-D Header2'),
 ('ABC-D data1 data2..3..data4 '),
 ('ABC-D Tail')
)v(Seq1)

Результат здесь

enter image description here

...