SQL以基于列获取单行的组合行

时间:2017-03-17 17:46:31

标签: sql oracle

我有一张表如下:

+---+---+---+
|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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-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'
  

注意:你的案例是这种联接的一个相对简单的例子 - 我这样编码是因为使用我的方法可以扩展到更复杂的情况并且仍然可以工作。对于这个特殊要求,还有其他一些方法可能更简单。

     

特别是最常见的一个是加入多个表,而不是所有表都在同一个表中。我的方法仍适用于这些情况。