基于其他列在db列上进行转置

时间:2014-08-27 10:41:45

标签: sql oracle transpose

我需要围绕一个列进行旋转,但它必须依赖于另一列。

G_ID    COL_ONE  COL_TWO   COL_THREE    
146157  228830   null      228828
146157  228831   228830    228863

我有G_ID,它在我想要转动的方式上是不变的。我想要展示

G_ID    COL_THREE_1    COL_THREE_2 
146157  228863         228828          

现在,这里的业务规则是它变得有趣的地方,我需要一些指示。

  • 当它不为空时我必须读取COL_TWO。 (第一个是228830)
  • 在COL_THREE_1的此行中显示COL_THREE作为输出(228863)
  • 读取COL_TWO的值,然后将其映射到另一行的COL_ONE,然后将此行中的COL_THREE输出到COL_THREE_2(228828)

在这个示例中,我只显示一个G_ID,但有很多,所以我需要一些可以在多个G_ID上工作的东西

关于此的任何指示。我发现这有点挑战,所以很高兴有一个去,但只需要一些指示从哪里开始

由于

2 个答案:

答案 0 :(得分:1)

以下是使用聚合函数的尝试(我无法弄清楚如何使用pivot子句执行此操作):

select t.g_id,
       min(t.val_three) keep (dense_rank first order by t.val_two) VAL_THREE_1,
       max(t.val_three) keep (dense_rank last order by t.val_two) VAL_THREE_2
from my_table t
group by t.g_id
;

我向my_table添加了更多值以提供更好的观点:

G_ID    VAL_ONE  VAL_TWO   VAL_THREE    
146157  228830   null      228828
146157  228831   228830    228863
146234  228832   null      228567
146234  228833   228835    228789
然后我得到:

    G_ID    VAL_THREE_1 VAL_THREE_2
1   146157  228863      228828
2   146234  228789      228567

答案 1 :(得分:1)

对于这个要求,我猜自我加入就足够了:

with tab (G_ID,COL_ONE,COL_TWO,COL_THREE) as ( 
  select 146157,228830,null,228828 from dual union all
  select 146157,228831,228830,228863 from dual union all
  select 146158,228831,null,228829 from dual union all
  select 146158,228832,228831,228864 from dual)
--------------------------
-- End if Data preparation
--------------------------
select a.g_id, b.col_three col_three_1, a.col_three col_three_2
  from tab a 
  join tab b on a.COL_ONE = b.COL_TWO and a.G_ID = b.G_ID
 where b.col_two is not null;

输出:

|   G_ID | COL_THREE_1 | COL_THREE_2 |
|--------|-------------|-------------|
| 146157 |      228863 |      228828 |
| 146158 |      228864 |      228829 |