2017-07-11 1 views
0

Ich habe Problem bei der Abfrage einer Spalte mit Differenzwert zur Anzeige in 2 Spalten Ergebnis in PosgrestSql. Der angezeigte Wert bedeutet "ausstehend", für die Anzeige "0" wurde bereits bezahlt. Und müssen alle ausstehenden Spalten anzeigen und die bereits bezahlte neue Spalte zählen. Ich habe viele Abfragen versucht, konnte aber nicht finden.So wählen Sie eine Spalte aus, um als 2 Spalten anzuzeigen Ergebnis mit Differenzwert in Postgresql

Meine erste Abfrage wie folgt: first query

Und dann brauche ich das Ergebnis wie folgt: I need the result

Und für meine neue Abfrage, die ich versuche, wie unten:

SELECT 
    m.customercd, 
    ta.agreementcd, 
    (SELECT 
    (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) 
    FROM t_agreement ta 
    INNER JOIN t_creditdetail tcd 
    ON ta.agreementcd = tcd.agreementcd 
    WHERE (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) != 0) 
    AS Installment, 
    (SELECT 
    (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) 
    FROM t_agreement ta 
    INNER JOIN t_creditdetail tcd 
    ON ta.agreementcd = tcd.agreementcd 
    WHERE (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) = 0) 
    AS Installment_PAID, 
    m.corpname, 
    m.employeenum 
FROM t_agreement ta 
INNER JOIN t_creditdetail tcd 
    ON ta.agreementcd = tcd.agreementcd 
INNER JOIN m_customer m 
    ON ta.customercd = m.customercd 
WHERE ta.agreementcd IN ('1502-0004759-9', '1506-0006177-9', '1506-0006327-8') 
ORDER BY agreementcd 

Aber Fehler:

ERROR: more than one row returned by a sub query used as an expression

Also gibt es irgendwelche Experten, die mir dabei helfen? Würde sehr mit Ihrer Hilfe zu schätzen wissen.

Vielen Dank, SmallCorner

+0

Was ist mit dem Fehler ist Ihnen nicht klar? Normalerweise sind Sie der einzige, der das beheben kann, weil es die Logik der Abfrage zu kennen erfordert. –

+0

@Tim, also wie wäre es mit meiner Anfrage? Gibt es einen möglichen Weg dies zu tun? – SmallCorner

+0

IMO sollten Sie Ihre Abfrage neu schreiben. Verwenden Sie CTE, um Ratenzahlung, Ratenzahlung_PAID in 2 temp_table zu berechnen, und verbinden Sie sie dann, um das erwartete Ergebnis zu erhalten. –

Antwort

1

Okay ich jede Abfrage durchbrechen musste, um zu verstehen, was hier so los ist effektiv Ihre Hauptabfrage mit den Unterabfragen entfernt und ersetzt w/Kommentare

Hauptabfrage

select 
    m.customercd, 
    ta.agreementcd, 
    # installment sub query 
    # installment paid sub-query 
    m.corpname, 
    m.employeenum 
from t_agreement ta 
    JOIN t_creditdetail tcd ON ta.agreementcd = tcd.agreementcd 
    JOIN m_customer m ON ta.customercd = m.customercd 
where ta.agreementcd in ('1502-0004759-9','1506-0006177-9','1506-0006327-8') 
order by agreementcd; 

unbezahlte Raten

select 
    tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal AS installment 
from t_agreement ta 
    JOIN t_creditdetail tcd ON ta.agreementcd = tcd.agreementcd 
where 
    (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) != 0; 

bezahlte Raten

select 
    tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal as installment_paid 
from t_agreement ta 
JOIN t_creditdetail tcd ON ta.agreementcd = tcd.agreementcd 
where 
    (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) = 0; 

I entfernt INNER JOIN da es die gleichen wie JOIN ist. Sie sollten Ihr Bestes tun, um Unterabfragen zu vermeiden (zusätzliche Komplexität, Performance-Probleme), aber wenn Sie sie verwenden müssen (ich muss unzählige Male bei der Arbeit), sollten Sie sie selbst ausführen, um zu sehen, welche Ergebnisse sie zurückgeben. In Ihrem Fall glaube ich nicht, dass Sie sogar Subqueries in der Select-Anweisung verwenden könnten, da sie an Ihre Vereinbarung gebunden sein müssen. Sie müssten sie als Joins verwenden. So oder so sollte diese Antwort funktionieren.

Antwort

select 
    m.customercd, 
    ta.agreementcd, 
    tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal AS balance, 
    m.corpname, 
    m.employeenum 
from t_agreement ta 
    JOIN t_creditdetail tcd ON ta.agreementcd = tcd.agreementcd 
    JOIN m_customer m ON ta.customercd = m.customercd 
where 
    ta.agreementcd in ('1502-0004759-9','1506-0006177-9','1506-0006327-8') 
    and (tcd.balanceprincipal + tcd.balanceinterest + tcd.balanceapprovalfeeprincipal) != 0 # unpaid balances 
order by agreementcd; 
+0

Vielen Dank für Ihren freundlichen Vorschlag, Sie haben mich vorsichtig gemacht und einen weiteren Schritt aufgesprungen. Danke mein Herr. Kann ich Ihnen das Abfrageergebnis zurücksenden? Wie ich in meinem PC laufe, funktioniert die Unterabfrage, die Sie trennen, gut, aber für die letzte Kombination gibt es mich auf null zurück (keine irgendeine Reihe). und eigentlich, was wir brauchen, zeigen auch beide von installment_pending und install_paid; wie du vielleicht nur unbezahltes Recht hast? Jeder Vorschlag mehr könnte sehr schätzen, Herr. Vielen Dank, SmallCorner – SmallCorner

Verwandte Themen