如果字段E包含“MSD__CMT_Change”则

时间:2012-09-19 16:39:38

标签: sql oracle oracle10g

我不确定这是否可以在SQL Query中完成。我可以做到EXCEL。

查询

SELECT
        A,
        B,
        C,
        D,
        E,
        F
from TableA
where D in ('MSD_CHANGE','MSD_CMT_CHANGE')


sheet http://i49.tinypic.com/1enm7m.jpg

如果字段D包含MSD_CMT_CHANGE,则在行上方和右侧1 = 7866 excel语言中的另一个词E1 = E2。

目前我从SQL中获取查询数据并在Excel中运行脚本来执行此操作 如果我可以在SQL中做,那将减少我的工作量。

VBA代码:

Sub Test
    Dim rng as Range, cl as Range

    Set rng = Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)

    For each cl in rng
       If cl = "MSD_CMT_CHANGE" AND cl.Offset(-1, 0) = "MSD_CHANGE" Then
           cl.Offset(-1, 1) = cl.Offset(0, 1)
       End If
    Next cl
End Sub

解释

if field_D = MSD_CMT_CHANGE then  

   compare row above it if equal "MSD_CHANGE" then 

        cell E1 = E2.

我有超过5000行数据。

检查下面的图像以获得更好的解释。

1 个答案:

答案 0 :(得分:1)

我假设有一个列(在我的示例中该列为id)您按顺序排序数据,以便得到列D

A    D            
------------------
1 MSD_CHANGE
-----------------
2 MSD_CMT_CHANGE
-----------------
3 MSD_CMT_CHANGE
-----------------
4 MSD_CHANGE

在此示例中,ID是您按

订购数据的列
select id
      , d
      , decode(d, 'MSD_CHANGE', 
               decode(lead(d, 1, d) over(order by id), 'MSD_CMT_CHANGE', 
                      lead(e, 1, e) over(order by id) , e 
                      ) 
              ,e) e
  from t1
  order by id

这是DEMO