2017-08-04 23 views
3

如果我有這樣的一個表:SQL - 兩列到一個不同的有序列

Col 1 | Col 2 
------------- 
    A | 1 
    A | 2 
    B | 1 
    C | 1 
    C | 2 
    C | 3 

我如何編寫一個查詢來拉一列看起來像這樣 -

Col 1 
------ 
    A 
    1 
    2 
    B 
    1 
    C 
    1 
    2 
    3 
+0

你想同樣的順序預計 – Chanukya

+0

'選擇COL1工會選擇col2' – TheGameiswar

+0

@ TheGameiswar - 'union all'更快 – Hogan

回答

4
SELECT col1 
FROM Some_Table_You_Did_Not_Name 

UNION ALL 

SELECT col2 
FROM Some_Table_You_Did_Not_Name 

如果在你的榜樣的順序問題,那麼你想這樣的:

WITH data AS 
(
    SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY col1, col2) as RN 
    FROM Some_Table_You_Did_Not_Name 
) 
SELECT col 
FROM (
    SELECT DISTINCT col1 as col, RN, 1 as O 
    FROM data 

    UNION ALL 

    SELECT DISTINCT col2 as col, RN, 2 as O 
    FROM data 
) JC_IS_THAT_GUY 
ORDER BY RN ASC, O ASC, col ASC 
+0

@JohnCappelletti - 這就是我使用db2得到的很多(不需要別名)。 - 我認爲我的命令是正確的 - 出了什麼問題? – Hogan

+0

肌肉記憶的東西。我知道。 :) –

+0

好吧,這很有趣! –

2

您可以使用查詢類似如下:

SELECT Col1 
FROM (
    SELECT DISTINCT Col1, Col1 AS Col2, 0 AS grp 
    FROM mytable 

    UNION ALL 

    SELECT Col2 AS Col1, Col1 AS Col2, 1 AS grp 
    FROM mytable) AS t 
ORDER BY Col2, grp, Col1 

Demo here

0

是絕對沒有必要做一個UNION,UNION ALL或引用表不止一次unpivot的數據...

-- if Col2 is always a well ordered sequense like the test data... 
SELECT 
    Col1 = x.Value 
FROM 
    #TestData td 
    CROSS APPLY (VALUES (IIF(td.Col2 = 1, td.Col1, NULL)), (CAST(td.Col2 AS CHAR(1)))) x (Value) 
WHERE 
    x.Value IS NOT NULL; 

-- if it isn't... 
WITH 
    cre_Add_RN AS (
     SELECT 
      td.Col1, 
      td.Col2, 
      RN = ROW_NUMBER() OVER (PARTITION BY td.Col1 ORDER BY td.Col2) 
     FROM 
      #TestData td 
     ) 
SELECT 
    x.Value 
FROM 
    cre_Add_RN arn 
    CROSS APPLY (VALUES (IIF(arn.RN = 1, arn.Col1, NULL)), (CAST(arn.Col2 AS CHAR(1)))) x (Value) 
WHERE 
    x.Value IS NOT NULL; 

HTH, 傑森

+0

這將會*重複*'Col1'的值如下:'A 1 A 2 ..' –

+0

啊......好!我錯過了Col1沒有重複的部分...我會在一秒內發佈修復... –

+0

答案已更新... –

相關問題