2012-04-10 2 views
0

AccountNum, InvoiceAcc 및 Blocked의 세 행을 가진 테이블이 있습니다. 대부분의 행에는 내 표에 InvoiceAcc가 있지만 전부는 아닙니다. AccountNum은 고유 한 식별자이며 여러 AccountNum이 동일한 InvoiceAcc를 가질 수 있습니다. Blocked는 0, 1 및 2의 int 값입니다.SQL - Subselect 사용

InvoiceAcc는 AccountNum을 기반으로하므로 Child Office가 진행되는 부모 사무실로 간주됩니다. 예를 들어

, 그래서 같은 부모 사무실 :

AccountNum - 1, InvoiceAcc - null, Blocked - 2 그래서 같은 자식 사무실이 있습니다

AccountNum - 1-1, InvoiceAcc - 1, Blocked - 0 

AccountNum - 1-2, InvoiceAcc - 1, Blocked - 1 

내가 할 싶습니다 어떤 행과 그 이후의 InvoiceAcc을 확인하다 AccountNum은 값을 차단했습니다. 위의 예에서 위와 같이 쿼리를 수행 한 경우 :

SELECT BLOCKED FROM CustTable WHERE AccountNum = '1-1' 

차단 된 값이므로 0이 반환됩니다. 내가하고 싶은 것은 수익이 2이고 반환 값이 더 높고 상위 계정이 있기 때문입니다. 또한 부모 acc에 1의 차단 값이 있고 조회중인 하위 계정의 차단 값이 2 인 경우 2를 반환해야합니다. 여기서 subselect가 필요하다고 가정합니다. 중 자체 또는 부모 계정에 부모 계정 조금 지저분한의

답변

1

뿐만 아니라 당신은 하나의 레벨을 가지고 (예를 들어, 부모 -> 아이)

SELECT CASE 
    WHEN child.blocked > COALESCE(parent.blocked,0) 
    THEN child.blocked 
    ELSE parent.blocked 
END as blocked 
FROM CustTable child 
LEFT JOIN CustTable parent ON child.InvoiceAcc = parent.AccountNum 
WHERE child.AccountNum = '1-1' 
+0

이것은 또한 accno = 1에 대해 정적입니다. – SMK

+0

Nop, 아닙니다. 매개 변수로 바꾸거나 위치를 모두 제거하면 각 고객의 최고 블록 값이 표시됩니다. – CallumVass

0

이있는 경우

그것은, 세계적으로 가장 차단 값을 반환해야합니다. "1-?"입니다. 너를 망치고있어.

ParentAccount = 1, 하위 계정 = 2,

그런 다음 당신은 당신의 현재 구조를 유지

Select parent.Blocked From SomeTable parent 
inner join SomeTable Children On Parent.ParentAccount = Child.ParentAccount 

처럼 somethimng와 ParentAccount에 의해 선택할 수 있음을 해결할 것이다 당신은 가지고 올해야 할 것 문자열 함수의 무리는 "AC"에서는 A를 추출하는

당신은이처럼 쿼리를 작성할 추가 할 수 있습니다
+0

안녕하세요, 이것이 내가 시작되기 전에 이미 exsisted 비즈니스 시스템입니다! 현재 수천 명의 고객이 너무 늦어서 지금 바꿀 수 없습니다! – CallumVass

+0

아, 그럼 @ Shoaib의 대답은 가까이에있을 것 같습니다. 그것은 그것이 될 수있는만큼 공연하지 않을 것입니다. 당신이 불쾌한 오두막집으로 남겨질 처음은 아니고, 나는 많은 것을했습니다. –

0

사용이 :

select AccountNum ,(select count(*) from CustTable where AccountNum like t.AccountNum +'-%') as Totalsubacc from CustTable t where AccountNum not like '%-%' 
관련 문제