2016-11-10 3 views
1

У меня есть таблица с двумя столбцами, как это:Две колонок в одну, используя альтернативные строки

A 1 
B 2 
C 3 
D 4 
E 5 

т.д.

Я хочу, чтобы получить их в одну колонки, с данными каждого столбца в чередующихся рядах новый столбец, как это:

A 
1 
B 
2 
C 
3 
D 
4 
E 
5 

т.д.

+0

Вы можете попробовать использовать функцию для этого или использовать CTE запрос с комбинацией функции подстроки – Learning

+0

Чтобы получить право на заказ, чтобы получить результаты в альтернативных строках, вам нужно добавить третий столбец в исходную таблицу, чтобы наложить заказ. Вместе с приведенными ниже ответами вы получите ожидаемый результат. –

+0

Похоже, основная проблема здесь заключается в том, что SQL-таблицы рассматриваются как те же, что и в электронной таблице. Несмотря на поверхностное сходство, они не одно и то же. Все значения строк должны быть близко привязаны к одной «вещи». Отдельные строки должны быть независимыми. Строки и столбцы не взаимозаменяемы. –

ответ

1
CREATE TABLE #Table1(Value VARCHAR(10),Id VARCHAR(10)) 

INSERT INTO #Table1(Value ,Id) 
SELECT 'A',1 UNION ALL 
SELECT 'B',2 UNION ALL 
SELECT 'C',3 UNION ALL 
SELECT 'D',4 UNION ALL 
SELECT 'E',5 

;WITH _CTE (Name) AS 
(
SELECT Value [Name] 
FROM #Table1 
UNION ALL 
SELECT Id [Name] 
FROM #Table1 
) 
SELECT * FROM _CTE 
1

Хитрость является данные в черезстрочного

select col2 
from 
(select col1, 1 as flag, col1 from tab 
    union all 
    select col1, 2,   col2 from tab 
) as dt 
order by col1, flag 

Но почему вы пытаетесь это сделать вообще?

1

Попробуйте это:

WITH CTE AS 
(
    SELECT Col1Name Name,(ROW_NUMBER() OVER(ORDER BY(SELECT NULL))) RN 
    FROM TableName 
    UNION 
    SELECT Col2Name Name,(ROW_NUMBER() OVER(ORDER BY(SELECT NULL)))+1 RN 
    FROM TableName 
) 
SELECT Name 
FROM CTE 
ORDER BY RN 
+0

Этот заказ - это лучшее, что вы можете сделать, без третьей колонки, чтобы наложить порядок. Возможно, вы могли бы расширить это? –

+0

Спасибо за предложение. но этот скрипт приведет к тому, что ищет op. вы можете попробовать это и с образцами данных. ;) –

+1

Уверенный, конечно :) Я просто хотел указать, что 'ORDER BY (SELECT NULL))' делает произвольное упорядочение. Он может измениться, когда, например, индексы добавляются/изменяются. Я бы набрал ответ, но, увидев, что есть уже три ответа, я просто подумал, может быть, вы могли бы расширить это. –

2

Я хотел бы использовать UNION ALL но вот UNPIVOT альтернатива:

CREATE TABLE #Table1(letter VARCHAR(10),Id VARCHAR(10)) 

INSERT INTO #Table1(letter ,Id) 
SELECT 'A',1 UNION ALL 
SELECT 'B',2 UNION ALL 
SELECT 'C',3 UNION ALL 
SELECT 'D',4 UNION ALL 
SELECT 'E',5 


SELECT [value] 
FROM #Table1 
UNPIVOT 
(
    [value] FOR [Column] IN ([Id], [letter]) 
) UNPVT 


DROP TABLE #Table1;