2012-04-10 6 views
0

私はAccountNum、InvoiceAcc、Blockedの3行のテーブルを持っています。ほとんどの行、私のテーブルにはInvoiceAccがありますが、すべてではありません。 AccountNumは固有の識別子であり、複数のAccountNumが同じInvoiceAccを持つことが可能です。ブロックされたint値は0,1,2から変化します。SQL - サブセレクトを使用

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

あなたは1つのレベル(例:parent - > child)だけを持つように書くことができます

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 '%-%' 
関連する問題