2012-04-10 11 views
0

Ich habe eine Tabelle mit 3 Zeilen: AccountNum, InvoiceAcc und blockiert. Die meisten Zeilen meiner Tabelle haben einen InvoiceAcc, aber nicht alle. AccountNum ist der eindeutige Bezeichner und es ist möglich, dass mehrere AccountNum den gleichen InvoiceAcc haben. Blocked ist ein int-Wert, der von 0, 1 und 2 abweicht.SQL - Verwenden einer Unterauswahl

Der InvoiceAcc basiert auf einem AccountNum, also denken Sie an ihn als ein Elternbüro, das dann weiterführende Child Offices hat.

Zum Beispiel kann ein Elternteil Büro wie so:

AccountNum - 1, InvoiceAcc - null, Blocked - 2 könnte ein Kind Büros wie so hat:

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

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

Was ich möchte, ist zu tun, um die InvoiceAcc einer Zeile und ihre späteren prüfen AccountNum blockierter Wert. Also in meinem obigen Beispiel, wenn ich eine Abfrage wie so tue:

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

Es würde zurückkehren 0 als dass der blockierte Wert ist. Was ich möchte, ist die Rückgabe von 2, da dieser den höheren Wert hat und das Elternkonto ist. Wenn der übergeordnete acc einen blockierten Wert von 1 hat und das untergeordnete Konto, das ich abfrage, einen blockierten Wert von 2 hat, dann sollte es 2 zurückgeben. Ich nehme an, dass ein subselect hier benötigt würde?

Es sollte den höchsten blockierten Wert basierend Rendite entweder selbst oder seine Eltern erklären, wenn es ein übergeordnetes Konto hat

Antwort

1

Sie eine Abfrage so schreiben kann jedoch als nur, wie Sie nur eine Ebene (zB Eltern -> Kind)

diese
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

das ist auch statisch für accno = 1 – SMK

+0

Nop, nicht wenn ich das durch einen Parameter ersetze oder sogar den wo ganz entferne, da dies den höchsten Blockwert jedes Kunden zeigt – CallumVass

0

Das ist ein bisschen chaotisch ist. Es ist die "1-?" das bringt dich durcheinander.

ParentAccount = 1, Unterkonto = 2 würde beschließen, dass

Dann sind Sie von ParentAccount mit somethimng wie

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

Halten Sie Ihre aktuelle Struktur wählen könnten und Sie werden mit einem kommen bis haben Bündel von String-Funktionen, die A von „AC“ zu extrahieren

+0

Hallo, dies ist das Business-System, das bereits exsisted bevor ich anfing! Es hat Tausende von Kunden so zu spät, um jetzt zu ändern! – CallumVass

+0

Ah gut, sieht aus wie @ Shoaibs Antwort wird dann nah sein. Es wird nicht so leistungsfähig wie es sein könnte. Nicht das erste Mal, dass du einen bösen Brei übrig hast, ich habe viele davon gemacht. –

0

Verwendung:

select AccountNum ,(select count(*) from CustTable where AccountNum like t.AccountNum +'-%') as Totalsubacc from CustTable t where AccountNum not like '%-%' 
Verwandte Themen