2016-10-24 4 views
0

Ich habe 3 TabellenSubtrahierend Summen aus zwei Tabellen-Gruppe durch eine dritte Tabelle beträgt doppelt in SQL

client,fees,financial 

Ich möchte

  • Summe aller Gebühren (fees.fee) für Client ‚925 'und subtrahieren Sie alle Zahlungen (finanzielle.Zahlung).
  • zeigen Sie den Client-Nachnamen (client.lastname).

Die Gebühren und Finanztabellen sind FK zu client.Id über eine Gebühren.clientId und financial.clientId.

Ich dachte, das wäre einfach, aber einzelne Aussagen zeigen korrekte Beträge, aber wenn sie verbunden sind, verdoppeln sie sich aufgrund der vielen Gebühren und einer Zahlung.

Ich habe viele verschiedene Aussagen ausprobiert und neu zu sein sql bin völlig ratlos.

Könnte jemand mich zu einer Probe am Punkt verweisen oder beim Schreiben dieser Auswahlanweisung helfen.

Jede Hilfe wäre willkommen.

+2

bitte einige Beispieldaten veröffentlichen – mohan111

+0

klingt wie Sie nur einige Gruppierung benötigen, aber ohne richtige Schema nicht helfen kann, und Beispieldaten – Tanner

+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple- sql-query – Strawberry

Antwort

0

Dies sollte Sie auf den richtigen Weg bringen. Sie können den folgenden Code getrennt von Ihrer tatsächlichen Datenbank ausführen.

CREATE TABLE #client 
    ( 
     id INT, 
     name NVARCHAR(10) 
    ) 

CREATE TABLE #fees 
    (
     clientId INT , 
     fees DECIMAL(18, 2) 
    ) 

CREATE TABLE #financials 
    (
     clientId INT , 
     payment DECIMAL(18, 2) 
    ) 

INSERT INTO #client (id, name) 
VALUES (925, N'Company A') 

INSERT INTO #fees (clientId , fees) 
     SELECT 925 , 120.00 
     UNION ALL 
     SELECT 925 , 20.00 
     UNION ALL 
     SELECT 925 , 200.00 
     UNION ALL 
     SELECT 925 , 60.00 

INSERT INTO #financials (clientId , payment) 
     SELECT 925 , 125 
     UNION ALL 
     SELECT 925 , 250 
     UNION ALL 
     SELECT 925 , 75 

-- total fees = 400 
SELECT clientId , 
     SUM(fees) Fees 
FROM #fees 
GROUP BY clientId 

-- total paid = 450 
SELECT clientId , 
     SUM(payment) Paid 
FROM #financials 
GROUP BY clientId 

-- Single query with difference 
SELECT c.id , 
     c.name , 
     TotalFees , 
     TotalPaid , 
     f.TotalFees - fi.TotalPaid AS FeesLessPaid 
FROM #client c 
     INNER JOIN (SELECT clientId , 
          SUM(fees) TotalFees 
        FROM #fees 
        GROUP BY clientId 
        ) f ON f.clientId = c.id 
     INNER JOIN (SELECT clientId , 
          SUM(payment) TotalPaid 
        FROM #financials 
        GROUP BY clientId 
        ) fi ON fi.clientId = c.id 

DROP TABLE #client 
DROP TABLE #fees 
DROP TABLE #financials 

Produziert:

id name  TotalFees TotalPaid FeesLessPaid 
925 Company A 400.00  450.00  -50.00 
+0

ich bevorzuge linken äußeren Client mit anderen Tabelle. Es wird keine Kunden verpassen. –

0

etwas Versuchen wie folgt vor:

SELECT CO.LASTNAME,COALESCE(A.FEE,0)-COALESCE(B.PAYMENT,0) AMT_LEFT 
FROM CLIENT CO 
LEFT OUTER JOIN 
    (
    SELECT C.CLIENTID,SUM(F.FEE)FEE 
    FROM CLIENT C 
    INNER JOIN FEES F 
    ON C.CLIENTID=F.CLIENTID)A 
ON CO.CLIENTID=A.CLIENTID 
LEFT OUTER JOIN 
    (
    SELECT C.CLIENTID,SUM(F.PAYMENT)PAYMENT 
    FROM CLIENT C 
    INNER JOIN FINANCIAL F 
    ON C.CLIENTID=F.CLIENTID)B 
ON CO.CLIENTID=B.CLIENTID 
Verwandte Themen