SQL 0

2012-08-24 3 views
1

까지 두 개의 열을 기반으로 값을 감소 나는 다음과 같은 데이터 세트 (단지 샘플)이 있습니다SQL 0

:

ID MAX AMT SORTED 
1  20  0 1 
1  30  0 2 
1  40  0 3 
1  50  0 4 
2  0  0 1 
2  30  0 2 
2  40  0 3 
2  40  0 4 
... 

표 2을 :

ID AMT 
1  75 
2  70 
... 

이 규칙을 사용하여 Table1.AMTTable2.AMT에서 업데이트해야합니다 :

  1. Table1Table2Table2.AMT - previous record AMT 여전히 위의 규칙을 사용하여 다음 행 업데이트 Table1.AMT에 다음 ... MAX
  2. 다음 Table2.AMT >= Table1.MAX 경우 Table1.AMT = Table1.MAX보다 큰 값을 물을 수 없습니다 ID
  3. Table1.AMT에 연결된다.

그래서 예상되는 출력은

ID MAX AMT SORTED 
1  20  20 1 
1  30  30 2 
1  40  25 3 
1  50  0 4 
2  0  0 1 
2  30  30 2 
2  40  40 3 
2  40  0 4 
... 

이 어떻게 그 달성 할 수 있을까?

Table1.MAX의 응집 SUM()와 임시 테이블을 생성하고, 기준으로서 Table1.AMT (만약 SUM(MAX) < Table2.AMT Table1.AMT = previous records SUM(MAX) 다음 Table1.AMT = Table1.MAX 다른)을 업데이트하는 것으로하여 생각.

하지만 임시 테이블없이 완료 할 수 있습니까? (슬프게도 내 작업 환경에서 함수와 프로 시저를 만들 수 없습니다.)

+0

질문은 'SUM()'기능이 생길 때까지 아주 분명했습니다. 두 번째 규칙은 실제로 "Table1.AMT는 모든 Table1.MAX 값의 합보다 큰 값을 보유 할 수 없습니다"라는 의미입니다. 또는 "Table1.AMT는 모든 Table2.AMT 값의 합보다 큰 값을 보유 할 수 없습니다"? – fancyPants

+0

db 엔진은 무엇입니까? –

+0

오라클 10g 및 표 1.AMT는 행 MAX보다 클 수 없습니다. 표 1 SUM AMT = 표 2 AMT –

답변

1

자세한 내용이나 Oracle PL/SQL을 사용하여보다 효율적인 솔루션을 만들 수 있습니다. AMT 계산

select t1.ID, min(t1.MAX) as MAX, least(min(t1.MAX),coalesce(min(t2.AMT),0)-coalesce(least(sum(t1p.MAX-t1p.AMT), min(t2.AMT)),0)+min(t1.AMT)) as AMT, t1.SORTED 
from Table1 t1 
left join Table2 t2 on t2.ID = t1.ID 
left join Table1 t1p on t1p.ID = t1.ID and t1p.SORTED < t1.SORTED 
group by t1.ID, t1.SORTED 
order by t1.ID, t1.SORTED 

설명 : 여기에

는 일반적인 솔루션입니다

AMT는 의 가장 작은는 "얼마나 많은 것이 가능하다"

"MAX 행에 대한"
least(min(t1.MAX),"How much is possible") 

"얼마나 많은 것이 가능하다" : 최대 가능 - 이전 행을 받았다 얼마나 + 우리는 이미

coalesce(min(t2.AMT),0) - "how much was given for previous rows" + min(t1.AMT) 

"얼마나 많은 이전 행을 받았다"얼마나 많은 : 많은에 필요한 방법 smalles을 채우기 및 가능한 한도

coalesce(least(sum(t1p.MAX-t1p.AMT), min(t2.AMT)),0) 
+0

답사 해줘서 고맙습니다. 월요일에 가겠습니다. BTW, "Imre"는 에스토니아의 공통적 인 이름입니다. –