2017-02-25 1 views
3

Ich habe 3 Tabellen
Tbcodetable
SQL 3 schließt sich mit einer Gruppe von und Summenfunktion

codevalue | codename | desc1 | desc2 
    1   | SATO  | NAG | Naga 
    2   | SATO  | BAG | Baguio 
    3   | SATO  | NCR | Head Office 

Tbmember

employeeno | capcon_accountno | savings_accountno | sato 
1   | 00101   | 00201    | NCR 
2   | 00102   | 00202    | BAG 

Tbdeposit

employeeno | account_no | accountbalance 
1   | 00101  | 1000 
1   | 00201  | 5000 
2   | 00102  | 1000 
2   | 00202  | 5000 

Was ich abfragen möchten ist die Summe der Kappe ital und Einsparungen pro Sato in einer Abfrage

codename | codevalue | desc1  | desc2 | capcon | savings 
SATO  |3   |Head Office |NCR |1000 | 5000 
SATO  |2   |Baguio  |BAG |1000 | 5000 
SATO  |1   |Naga  |NAG |0  | 0 

Die beste Abfrage, die ich tun könnte, ist

SELECT codename,codevalue,desc1,desc2,sum(b.accountbalance) as capcon 
    FROM TBCODETABLE c 
    left join TBMEMBER a on c.desc2 = a.SatoCode 
    join tbdeposit b on a.employeeno = b.employeeno 
where a.SLAStatus = 'A' and c.codename ='sato' 
group by codename, codevalue, desc1, desc2 

, die mir dieses Ergebnis

codename | codevalue | desc1  | desc2 | capcon 
SATO  |1   |Head Office |NCR |1000 
SATO  |2   |Baguio  |BAG |1000 

Dieses nur gibt mir die Summe des Kapitals gibt (Ich verloren, auf, wie schließen Sie sowohl Einsparungen als auch Kapital auf dem Ergebnis ein.) Und es schließt die Naga-Region nicht ein

Ich konnte tbmember und tbdeposit von employeeno beitreten, aber dann weiß ich nicht, wie Summe von Kapital und Einsparungen im Ergebnis trennen gesetzt

bearbeiten
ich die Abfrage bearbeitet und jetzt Im der Lage, beide dank Abfrage zu syed aber ich kann immer noch nicht den NAG-Sato-Code bekommen. Abfrage:

SELECT codename,codevalue,desc1,desc2, coalesce(sum(b.accountbalance),0) as savings, coalesce(sum(bb.accountbalance),0) as capcon FROM TBCODETABLE c left join TBMEMBER a on c.desc2 = a.SatoCode join tbdeposit b on a.SAVINGS_AccountNo = b.AccountNo 
inner join tbdeposit bb on a.CAPCON_Accountno = bb.AccountNo where a.SLAStatus = 'A' 
group by codename, codevalue, desc1, desc2 

ich in der Lage bin, das erwartete Ergebnis zu erhalten Danke Jungs chris LEFT JOIN Rat meines NAG SATO Problem obwohl Syed Antwort half mir große Zeit gelöst.
ich nicht, wie eine Antwort auf upvote so i chris upvote nur werde

Meine letzte Abfrage ist (hier erstmals.):

SELECT codename,codevalue,desc1,desc2, coalesce(sum(b.accountbalance),0) as savings, coalesce(sum(bb.accountbalance),0) as capcon FROM TBCODETABLE c left join TBMEMBER a on c.desc2 = a.SatoCode left join tbdeposit b on a.SAVINGS_AccountNo = b.AccountNo 
left join tbdeposit bb on a.CAPCON_Accountno = bb.AccountNo where a.SLAStatus = 'A' or codename = 'sato' 
group by codename, codevalue, desc1, desc2 
+0

In 'Tbcodetable' Sie * haben' codevalue' 1 ist Naga * und * 'codevalue' 3 ist Head Office *, aber in der resultierenden Tabelle ist es umgekehrt. – PetSerAl

+0

Und, BTW, warum brauchen Sie hier Gruppierung? IMHO, du musst nur 'Tbdeposit' zweimal beitreten. [Link] (http://sqlfiddle.com/#!9/6a7613/8) – PetSerAl

+0

Ja, ich habe gerade festgestellt, dass ich nur noch 1 weitere Join brauchte, wie der Link @SyedMZulqarnain sagte. Obwohl es immer noch nicht die NAG Sato im Ergebnis –

Antwort

0

Erstens, wenn Sie etwas gegen einen Tisch kommen Sie LEFT JOIN ed Sie müssen das auch ein left join machen, weil Sie sonst mit etwas enden, das stattdessen ein innerer Join ist. Das ist nicht dein einziges Problem.

Zweitens, für Wertvergleich, Fall ist wichtig, so sollten Sie c.codename ='SATO' haben, wenn Ihre Tabelle Probe korrekt ist.

Drittens Sie wahrscheinlich an diesem Punkt wollen in Ihrem SUM so eine Case-Anweisung hinzuzufügen:

SUM(case 
    when account_no = capcon_account_no 
    THEN accountbalance ELSE NULL END) 

Sie können etwas Ähnliches tun dann auch für Ihre Ersparnisse.

0

Ich denke, Sie müssen eine Gruppe von employeeno und account_no in einer Unterabfrage tun.Dann aufgeteilt capcon und Einsparungen in separaten Spalten mit einem case when:

select codename, 
     codevalue, 
     desc1, 
     desc2, 
     sum(case when a.savings_accountno = b.account_no then accountbalance else 0 end) as savings, 
     sum(case when a.capcon_accountno = b.account_no then accountbalance else 0 end) as capcon 
from tbcodetable as c 
     left join 
     tbmember as a 
     on c.desc1 = a.sato 
     left join 
     (
     select employeeno, 
       account_no, 
       sum(accountbalance) as accountbalance 
     from tbdeposit 
     group by employeeno, 
       account_no 
     ) as b 
     on a.employeeno = b.employeeno 
group by codename, 
     codevalue, 
     desc1, 
     desc2 

See SQLfiddle here

0

versuchen, diese

select codename,codevalue,desc1,desc2,coalesce(sum(accountbalance),0) as capcon, 
coalesce(deposite,0) as saving 
from tbcodetable tc 
left join tbmember tb 
on tc.codevalue = tb.employeeno 
left join(select max(employeeno) as employee,max(accountbalance) as deposite,accountbalance,employeeno from tbdeposite tp group by employeeno)l 
on tb.employeeno = l.employeeno group by codevalue; 

DEMO