我的表结构如下:
CREATE TABLE FAPDB.T_00_EXPO_DZ_MX
(
  ORDER_NO           VARCHAR2(30 BYTE),
  EXPO_STAT          VARCHAR2(1 BYTE),--1 成功 2 可疑 3 调整
  EXPO_NUM           NUMBER(8),
  EXPO_ORDERAMT      NUMBER(12,2)
)
表中的数据例如:
ORDER_NO   EXPO_STAT  EXPO_NUM  EXPO_ORDERAMT
11111111       1        2         100
11111111       2        2         100
11111111       3        2         100
33333333       1        2         100
33333333       2        2         100
33333333       3        2         100
22222222       1        4         200
44444444       2        4         200
EXPO_STAT是1的记录表示结算交易,不用调整
EXPO_STAT是2的记录表示可疑交易,需要调整,调整成功之后,增加EXPO_STAT为1和3的各一条记录(共两条),原来的EXPO_STAT=2的记录不变,这样同样订单号的记录就有三条了,如:ORDER_NO=11111111和ORDER_NO=33333333
EXPO_STAT是3的记录表示调整交易,肯定有EXPO_STAT为1和2的记录跟它对应
现在我想查询出所有已结算(EXPO_STAT=1)的和所有未调整(同一订单号下如果可疑和调整都有,则表示已调整,如ORDER_NO=11111111的 2和3要抵消,2不计入统计范围)的交易,请问该怎么写sql,注意不能用union
比如上面的查询结果是:
11111111       1        2         100
33333333       1        2         100
22222222       1        4         200
44444444       2        4         200不知道诸位看明白没有?

解决方案 »

  1.   

    SQL> select * from test;        NO       STAT        NUM        AMT
    ---------- ---------- ---------- ----------
          1111          1          2        100
          1111          2          2        100
          1111          3          2        100
          3333          1          2        100
          3333          2          2        100
          3333          3          2        100
          2222          1          4        200
          4444          2          4        2008 rows selected.
    SQL> select no,stat,num,amt
      2  from
      3  (
      4  select test.*,count(*) over(partition by no order by no) cnt,
      5  row_number() over(partition by no order by stat) rn
      6  from test
      7  )
      8  where cnt=1 or cnt=2 or
      9  cnt=3 and rn=1;        NO       STAT        NUM        AMT
    ---------- ---------- ---------- ----------
          1111          1          2        100
          2222          1          4        200
          3333          1          2        100
          4444          2          4        200
      

  2.   

    这个逻辑应该是:如果有3,必定存在2.且1个订单里1,2,3分别最多只能出现1次select * from T_00_EXPO_DZ_MX t
    where expo_stat='1'
      or expo_stat='2' and not exists(
        select 1 from T_00_EXPO_DZ_MX where order_no=t.order_no
          and expo_stat='3')
      

  3.   

    谢谢wildwave,方法比较实用,wh62592855的方法查询起来比较慢