2017-03-17 20 views
0

我有一個表如下:SQL得到合併行

+---+---+---+ 
|obj|col|Val| 
+---+---+---+ 
|1 |c1 | v1| 
+---+---+---+ 
|1 |c2 | v2| 
+---+---+---+ 
|2 |c1 | v3| 
+---+---+---+ 
|2 |c2 | v4| 
+---+---+---+ 

我期待的SQL,這將使結果按以下格式

+---+---+---+ 
|obj|c1 |c2 | 
+---+---+---+ 
|1 |v1 | v2| 
+---+---+---+ 
|2 |v3 | v4| 
+---+---+---+ 

回答

2

在這個SQL中,我正在檢查col ='c?'並打印出相應的Val。但是group by的原因是在條件不匹配的情況下避免所有NULL值。通過在obj上分組,所有的NULL值將被避免併產生所需的結果。

SELECT obj, 
     MAX(CASE WHEN col = 'c1' THEN Val END) AS c1, 
     MAX(CASE WHEN col = 'c2' THEN Val END) AS c2 
    FROM Table 
GROUP BY obj; 
+0

它的工作!謝謝 – Ibrahim

+0

請接受答案,如果你喜歡它..謝謝... – Teja

-1

首先,你需要從表中選擇所有的唯一ID

select distinct id 
from a_table_you_did_not_name 

你如何使用左連接到您的列

select base.id, one.val as c1, two.val as c2 
from (
    select distinct id 
    from a_table_you_did_not_name 
) base 
left join a_table_you_did_not_name one on one.id = base.id and one.col = 'c1' 
left join a_table_you_did_not_name two on two.id = base.id and two.col = 'c2' 

記:你的情況是這種連接的一個相對簡單的例子 - 我這樣編碼,因爲使用我的方法可以擴展到更復雜的情況下,仍然工作。對於這個特殊要求還有其他一些方法可能更簡單。

具體而言,最常見的是連接到多個表格,而不是全部在同一個表格中。我的方法仍然適用於這些情況。

+0

這是絕對*不*在SQL和Oracle的數據透視的方式。另一個答案(標記爲「正確」)顯示了最一般的解決方案。在Oracle 11及以上版本中,還有'PIVOT'子句。旋轉不需要連接。 – mathguy

+0

@mathguy - 這樣做和使用PIVOT子句之間沒有內部區別。另一個答案不是最一般的解決方案,考慮你有兩個表的情況,而你想要一個5列的結果。我的意思延伸到那種情況,而Teja's則不是。 – Hogan

+0

不知道你的意思是「內部差異」,我不熟悉這個概念。但不同之處在於,您的解決方案將三次讀取基表,而不是使用標準PIVOT解決方案。 (你否認這一點?)所以你做了很多不必要和昂貴的I/O。另一種解決方案是** pivoting **的最常用解決方案。你的解決方案不是「旋轉」的;從某種意義上講,它是更一般的,但是它解決了OP在這個線程中沒有的問題。 – mathguy