2016-09-01 3 views
0

을 삭제하기 전에 나는 다음과 같은 데이터 세트를 가지고 :까지 추가 값 중복 항목

Identifier | Revenue | Good Inflow 
----------------------------------- 
    abc123 | 20 | 15 
    abc124 | 10 | 5 
    abc124 | 5 | 5 

같은 식별자, 다른 수익하지만 동일 (중복) 좋은 유입을 가진 두 개의 선이 볼 수 있듯이. 두 번째 줄을 동일한 식별자로 없애고 첫 줄의 수익에 수익을 추가하는 것이 내가 원하는 것입니다. 결과는 다음과 같아야합니다 :

abc124 | 15 | 5 

이게 가능합니까? 그렇다면 어떤 명령이 필요합니까? Oracle SQL Developer를 사용합니다.

미리 감사드립니다.

펠릭스

+1

표 데이터를 이미지가 아닌 형식이 지정된 텍스트로 표시하십시오. 그것들은 당신의 탁자에있는 유일한 세 개의 기둥입니까? 해당 특정 행 쌍 (특정 값을 사용하여 간단한 업데이트 및 삭제로 수행 할 수 있음)을 결합하거나 결합해야하는 유사한 쌍이 많이 있습니까? –

+0

SELECT 쿼리 또는 delete 문으로 사용 하시겠습니까? – kbball

+0

@AlexPoole - 질문이 실제로 필요한 경우 (보고서의 데이터를 그룹화하는 것이 아니라 테이블의 데이터를 변경하는 것) - 이것이 좋은 습관입니까? 내 의견으로는, 대부분의 경우 그것은 빈약 한 실천이다. 분석 및보고 목적으로보기 (성능을 위해 필요한 경우 MV)를 작성할 수 있지만 기본 데이터는 그대로 두어야합니다. – mathguy

답변

0

병합으로 수행 할 수 있습니다. 더미 테이블로 데이터를 시뮬레이션 : 당신이 의사의 행 번호와 함께, 각 행에 대한 별도의 컬럼으로 총을 얻기 위해 분석 기능을 사용할 수 있습니다

create table t42 (identifier varchar2(10), revenue number, good_inflow number); 
insert into t42 values ('abc123', 20, 15); 
insert into t42 values ('abc124', 10, 5); 
insert into t42 values ('abc124', 5, 5); 
:

select t42.*, 
    sum(revenue) over (partition by identifier, good_inflow) as total_revenue, 
    row_number() over (partition by identifier, good_inflow order by rowid) as rn, 
    count(*) over (partition by identifier, good_inflow) as cnt 
from t42; 

IDENTIFIER REVENUE GOOD_INFLOW TOTAL_REVENUE RN CNT 
---------- ------- ----------- ------------- ---- ---- 
abc123   20   15   20 1 1 
abc124   10   5   15 1 2 
abc124   5   5   15 2 2 

그런 다음 수 이 경우 문을 merge 문으로 사용하고 기본 테이블의 rowidon 조건으로 추가하고 생성 된 cnt을 사용하여 중복 된 테이블 만 업데이트합니다 (따라서 한 번만 나타나는 ID/유입 쌍은 무의미하지 않습니다). 동일한 가치로 업데이트 됨 e) :

merge into (select t42.*, rowid from t42) t42 
using (
    select t42.*, rowid, 
    sum(revenue) over (partition by identifier, good_inflow) as total_revenue, 
    row_number() over (partition by identifier, good_inflow order by rowid) as rn, 
    count(*) over (partition by identifier, good_inflow) as cnt 
    from t42 
) tmp 
on (tmp.rowid = t42.rowid and tmp.cnt > 1) 
when matched then 
    update set revenue = case when tmp.rn = 1 then tmp.total_revenue else null end 
delete where (revenue is null); 

2 rows merged. 

delete 절은 업데이트 후 값에서 작동합니다. 각 조합에 대해 공칭 첫 행을 제외한 모든 경우에 대해 수익을 null로 설정하는 사례 식을 사용했습니다. null이 삭제 될 수 있습니다.

select * from t42; 

IDENTIFIER REVENUE GOOD_INFLOW 
---------- ------- ----------- 
abc123   20   15 
abc124   15   5 

그러나 수익 값은 null 일 수 있습니다. nullable 인 경우이를 처리 할 수 ​​있습니다.