如果我有這樣的一個表: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
如果我有這樣的一個表: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
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
@JohnCappelletti - 這就是我使用db2得到的很多(不需要別名)。 - 我認爲我的命令是正確的 - 出了什麼問題? – Hogan
肌肉記憶的東西。我知道。 :) –
好吧,這很有趣! –
您可以使用查詢類似如下:
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
是絕對沒有必要做一個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, 傑森
這將會*重複*'Col1'的值如下:'A 1 A 2 ..' –
啊......好!我錯過了Col1沒有重複的部分...我會在一秒內發佈修復... –
答案已更新... –
你想同樣的順序預計 – Chanukya
'選擇COL1工會選擇col2' – TheGameiswar
@ TheGameiswar - 'union all'更快 – Hogan