2017-03-17 21 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