2016-11-10 66 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

感谢您的建议。但是这个脚本会得到你想要的结果。你也可以试试这个样本数据。 ;) –

+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;