2017-11-20 15 views
0

Ich hatte dieses Problem, wo ich zwei Tabellen mit unterschiedlichen Werten bekam.Subtrahieren zwei Spalten aus zwei verschiedenen Tabelle mit unterschiedlichen Daten

TABELLE 1:

Description Qty Amount 
Proc 1   1  100 
Proc 2   1  50 
Proc 3   1  60 

TABELLE 2:

Description  Payment 
    Proc 1   60 
    Proc 1   30 
    Proc 2   20 
    Proc 3   60 
    Proc 2   20 

So sollte das Ergebnis wie:

Description  Balance 
    Proc 1   10 
    Proc 2   40 
    Proc 3   0 

Wie werde ich dies tun, mit Auswahlabfrage? Vielen Dank.

Ich habe diesen Code bereits ausprobiert, aber er sollte zuerst die verschiedenen Zeilen von TABLE1 abrufen und verschiedene Werte aus TABLE2 summieren, bevor die beiden Tabellen subtrahiert werden.

SELECT FEESList.[Fee Description], sum(StudentBILLING.Quantity* StudentBILLING.Total- isnull(StudReceipts.Amount,0)) as Balance 
FROM StudentBILLING INNER JOIN FEESList ON StudentBILLING.FeeID = FEESList.FeeID INNER JOIN SREGStudentInformation ON StudentBILLING.StudentID = SREGStudentInformation.ID INNER JOIN 
     SemesterList ON StudentBILLING.SemesterID = SemesterList.SemID INNER JOIN SchoolYear ON StudentBILLING.SYid = SchoolYear.[SY ID] FULL JOIN StudReceipts ON FEESList.FeeID = StudReceipts.FeeID 
WHERE (SREGStudentInformation.[Student ID] = @StudentNumber) AND (SemesterList.[Sem.] = @Sem) AND (SchoolYear.[School Year] = @SchoolYear) AND 
     (FEESList.[Type of Fee] = 2) AND (StudentBILLING.Quantity* StudentBILLING.Total- ISNULL(StudReceipts.Amount,0))>0 
GROUP BY FEESList.[Fee Description] 

Das Ergebnis ist davon;

Description Amount Payments 
    Proc 1  100  60 
    Proc 1  100  30 
    Proc 2  50  20 
    Proc 2  50  20 
    Proc 3  60  60 

Zu diesem Ergebnis, das nicht sein soll.

Description Amount 
    Proc 1  100  
    Proc 2  50 

Können Sie mir dabei helfen?

+0

Es sieht so aus, als ob Sie table1 - minus sum (table2) wollen, aber Ihre Mathematik ist falsch. Hast du versucht mit SUM ??? –

+1

Was hast du probiert? Hast du versucht, einen 'Join' zu verwenden? Abgesehen davon, warum ergibt "Proc 2" den Saldo "40", wenn Tabelle 2 zwei "Proc 2" hat, die jeweils 20 Zahlungen haben? Sollte es nicht 10 sein, da es 50 - 20 - 20 wäre? – Simon

+0

@Simon Ich habe meinem Beitrag einige Details hinzugefügt, kannst du mir bitte dabei helfen? – deitysha

Antwort

0

Sie Mathematik sind nicht korrekt Proc 2 = TABL1 50, Tab2 20+ 20 = Balance = 10

DECLARE @tab1 TABLE ([Description] NVARCHAR(15), Qty INT, Amount INT) 
INSERT INTO @tab1 
([Description], Qty, Amount) 
SELECT 'Proc 1',1,100 UNION ALL 
SELECT 'Proc 2',1,50 UNION ALL 
SELECT 'Proc 3',1,60 

DECLARE @tab2 TABLE ([Description] NVARCHAR(15), Payment INT) 
INSERT INTO @tab2 
([Description], Payment) 
SELECT 'Proc 1', 60 UNION ALL 
SELECT 'Proc 1', 30 UNION ALL 
SELECT 'Proc 2', 20 UNION ALL 
SELECT 'Proc 3', 60 UNION ALL 
SELECT 'Proc 2', 20 


SELECT 
     T.[Description] 
    , Balance = (T.Qty * T.Amount) - X.Payment 
FROM @tab1 T 
INNER JOIN 
(
    SELECT 
      T.[Description] 
     , Payment = SUM(T.Payment) 
    FROM @tab2 T  
    GROUP BY T.[Description] 
) X ON X.[Description] = T.[Description] 
+0

Können Sie mir helfen, es mit dem von mir bereitgestellten Beispielcode zu tun? Ich habe versucht, deins, aber es scheint mir einige Fehler zu geben. Vielen Dank – deitysha

0

links aus einer abgeleiteten Tabelle Beitritt wird Ihr Problem lösen. Alternativ können Sie es haben die etwas längere Strecke erfolgt durch Aggregation in einem WAK tun und dann

select t1.description 
     ,t1.amount - t2.sum as balance 
from table1 t1 
left join 
(select description 
     ,sum(payment) as sum 
from table2 
group by description) t2 on t1.description = t2.description 

einfach etwas zum Nachdenken ein Join:

Sie einen left join anstelle eines inner join verwenden möchten. Left join sagt, wenn es in dieser ersten Tabelle und nicht zweit ist, zeige null. Inner join sagt, zeige es nur, wenn es in beiden Tabellen ist. Und ich schätze, Sie wollen das Gleichgewicht auch zeigen, wenn eine Zahlung nicht erfolgt ist (nur eine Vermutung, aber das liegt an Ihrem Bericht).

Hier ist das rextester Beispiel, mit dem Sie spielen können.

0

Sie könnten unten mit Beispieldaten versuchen, die Sie

Zuerst zur Verfügung gestellt haben, wird es Zeilennummern erzeugt durch row_number() Funktion Partition mit von Description und Payment Säule, die Zahlung hat Duplikat gemacht & sum() wenn haben doppelte Zahlungen

;WITH cte AS (
    SELECT *, 
      ROW_NUMBER() OVER(PARTITION BY [Description], 
              Payment ORDER BY [Description]) rn 
    FROM <TABLE 2>) 
    SELECT t.[Description], 
      CASE 
       WHEN COUNT(DISTINCT c.rn) > 1 THEN SUM(c.Payment) 
       ELSE MAX(t.amount) - SUM(c.Payment) 
      END [Balance] 
    FROM cte c 
      JOIN <TABLE 1> t ON t.[Description] = c.[Description] 
    GROUP BY t.[Description]; 

Ergebnis:

Description  Balance 
    Proc 1   10 
    Proc 2   40 
    Proc 3   0 

Hinweis, aber Sie könnten auch mit Ihren Beispieldaten überprüfen, was, wenn eine Beschreibung sowohl Zahlungen gemacht hat, ist eine doppelte und andere ist einzigartig?

Verwandte Themen