如何从DML中删除冗余数据

时间:2013-06-08 12:25:51

标签: oracle dml

MDW_BILL1包含以下列

BILL_ID NOT NULL VARCHAR2(10)
CUSTOMER_ID VARCHAR2(10)
MONTH VARCHAR2(10)
YEAR NUMBER
TOTAL NUMBER
ACTIVE_INDICATOR VARCHAR2(10)

MDW_BILL_TRANSACTION1包含以下列:

BILL_TRANSACTION_ID NOT NULL VARCHAR2(10)
BILL_ID VARCHAR2(10)
ACCOUNT_ID VARCHAR2(10)
TRANSACTION_TYPE VARCHAR2(20)
COST NUMBER
ACTIVE_INDICATOR VARCHAR2(10)

这是我要执行的查询:

select 
    b.ACCOUNT_ID, b.TRANSACTION_TYPE, b.cost 
from 
    mdw_bill1 a, mdw_bill_transaction1 b 
where 
    a.CUSTOMER_Id='CUS0033' 
    and a.month='JUN' and a.year=2013;

o / p是:

ACCOUNT_ID TRANSACTION_TYPE           COST
---------- -------------------- ----------
AID0159    Transport Cost              182
AID0159    Meal Cost                  1300
AID0159    Subscription Cost           120
AID0161    Transport Cost              168
AID0161    Meal Cost                   840
AID0161    Subscription Cost           240
AID0160    Transport Cost           203.58
AID0160    Meal Cost                   650
AID0160    Subscription Cost           400
AID0164    Transport Cost           187.92
AID0164    Meal Cost                   720
AID0164    Subscription Cost           480

如何删除重复ACCOUNT_ID并为每组结算明细显示一个account_id

我将代码修改为

select b.ACCOUNT_ID, b.TRANSACTION_TYPE, b.cost from mdw_bill1 a
    inner join mdw_bill_transaction1 b
    on a.bill_id = b.bill_id
    where a.CUSTOMER_Id='CUS0033'
    and a.month='JUN' and a.year=2013;

但我仍然得到相同的结果

1 个答案:

答案 0 :(得分:1)

解决方案是枚举正在输出的行,并且只在每个组的第一行包含帐户ID:

select (case when seqnum = 1 then Account_Id else '' end),
       Transaction_type, cost
from (select b.ACCOUNT_ID, b.TRANSACTION_TYPE, b.cost,
             row_number() over (partition by account_id
                                order by b.bill_transacction_id) as seqnum
      from mdw_bill1 a, mdw_bill_transaction1 b 
      where a.CUSTOMER_Id='CUS0033'and a.month='JUN' and a.year=2013
     ) t
order by Account_id, seqnum

一些评论。您应该为表格提供合理的别名,例如b的{​​{1}}和mdw_bill1的{​​{1}}。您的原始查询没有bt子句;你需要它来保证行的排序 - 不能保证一个帐户将始终在相邻的行上。第三,以这种方式加入两个表看起来。 。 。我该说尴尬吗?我认为你打算让条件成为:

mdw_bill_transaction