2015-04-01 71 views
-2

在這個例子中,什麼SQL代碼將輸入錶轉換爲輸出表? (假設某種排序,奇數行去列2行和偶數行去與同一輸出行連續的奇偶成對欄3)。一次取兩行數據並將數據放入兩列?

input table: 
column1 
    A 
    B 
    C 
    D 
    E 
    F 

output table: 
column2 column3 
    A   B 
    C   D 
    E   F 

更新: 假設某種排序,奇數行去COLUMN2和偶數行去與連續的奇偶成對欄3在同一輸出行

+2

這比完全不清楚什麼更多的是對這些表中的數據拆分條件的數量。請詳細說明。 – abatishchev 2015-04-01 20:20:16

+1

假設有一些排序,奇數行進入第2列,偶數行進入第3列,在同一輸出行上有連續的奇偶對。 – user1744318 2015-04-01 20:27:14

+1

@ user1744318我想你應該把這個註釋放在問題裏面。 – 2015-04-01 20:38:57

回答

4

試試這個:

;WITH CTE AS (
    SELECT ROW_NUMBER() OVER (ORDER BY column1) AS rn, column1 
    FROM #mytable 
), CTE2 AS (
    SELECT * 
    FROM CTE 
    WHERE rn % 2 <> 0 
), CTE3 AS (
    SELECT * 
    FROM CTE 
    WHERE rn % 2 = 0 
) 
SELECT c2.column1 AS column2, c3.column1 AS column3 
FROM CTE2 AS c2 
LEFT JOIN CTE3 AS c3 ON c2.rn = c3.rn - 1 

CTE2包含所有奇數行,而CTE3包含所有偶數行。我們通過c2.rn = c3.rn - 1將連續的奇偶對連接在一起以獲得所需的結果集。

SQL Fiddle Demo

+0

多數民衆贊成我試圖使用,但導致downvotes的想法:( – 2015-04-01 20:33:11

+0

是不是在這裏使用連接矯枉過正? – Anon 2015-04-01 21:11:52

1

這種方法很容易適應不斷變化的輸出列

WITH cte AS (
    SELECT 
    column1 
    ,output_row = (ROW_NUMBER() OVER(ORDER BY column1)-1)/2 
    ,output_col = (ROW_NUMBER() OVER(ORDER BY column1)-1) % 2 
    FROM input_table 
) 
SELECT 
    column2 = [0] 
,column3 = [1] 
FROM cte 
PIVOT(MAX(column1) FOR output_col IN ([0],[1])) p 
+0

更改'(ORDER BY column1)'到任何你想要的。 – Anon 2015-04-02 16:21:32