2015-04-01 73 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