2016-11-10 26 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;