0

AccountNum、InvoiceAcc、Blocked の 3 行のテーブルがあります。テーブルのほとんどの行に InvoiceAcc がありますが、すべてではありません。AccountNum は一意の識別子であり、多数の AccountNum が同じ InvoiceAcc を持つ可能性があります。Blocked は、0、1、および 2 から変化する int 値です。

InvoiceAcc は AccountNum に基づいているため、子オフィスを処理する親オフィスと考えてください。

たとえば、次のような親会社です。

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を返すことです。また、親アカウントのブロック値が 1 で、照会している子アカウントのブロック値が 2 の場合、2 を返す必要があります。ここでサブセレクトが必要になると思いますか?

親アカウントがある場合は、それ自体またはその親アカウントのいずれかに基づいて、ブロックされた最高値を返す必要があります。

4

3 に答える 3

1

レベルが 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' 
于 2012-04-10T11:05:39.233 に答える
0

これを使って :

select AccountNum ,(select count(*) from CustTable  where AccountNum like t.AccountNum +'-%') as Totalsubacc from CustTable t where AccountNum not like '%-%'
于 2012-04-10T11:22:23.163 に答える
0

それは少し厄介です。それは「1-?」です。それはあなたを台無しにしています。

ParentAccount = 1、SubAccount = 2 は、それを解決します

次に、ParentAccount で次のようなものを選択できます

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

現在の構造を維持すると、「AC」から A を抽出するための一連の文字列関数を考え出す必要があります。

于 2012-04-10T10:57:25.183 に答える