我的表结构如下:
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不知道诸位看明白没有?
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不知道诸位看明白没有?
解决方案 »
- 新手,大家帮帮忙,为什么我的命名服务无法使用,急!
- 写一条sql语句,看起来简单,实现起来感觉很难的2
- SYSAUX,SYSTEM,UNDOTBS1 表空间使用率比较大
- Oracle CDC 捕捉不到变化两
- 如何设置ORALCE10g的用户密码永不过期[急!]
- oracle 存储过程 怎么少用 if then
- 字符集問題!
- Oracle9i中,要判断一个表是否存在,如果存在,就删除此表重新建立,没有就不删除重建,SQL该如何写?
- sql*net2.3问题,各位大侠救命
- ORACLE被黑,求救!!!!(在线给分)
- 当插入遇到主键重复,如何让数据库返回重复记录的那个rowid?
- set linesize无效的问题
---------- ---------- ---------- ----------
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
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')