2017-09-08 1 views
0

Kann ich bitte etwas Hilfe mit meinem SQL-Bericht Abfrage, ich bin 90% dort nur brauchen den letzten Schritt (noch lernen SQL so freundlich sein :)).SQL Single Row Abfrage Beratung

Wir haben derzeit zwei verschiedene Datenbanken:
- [DATABASE1] speichert alle unsere Vermögenswerte
- [database2] speichert alle Vermögenswerte, die wir noch
zahlen sich aus - - jede Zahlung gegen den Vermögenswert In dieser Datenbank zu die Bank, das Datum der Zahlung, der Betrag usw.
- - Die letzte Zeile für das Asset wird die letzte Zahlung sein, und das Datum wäre das erwartete Enddatum des Leasingvertrags.

Ich möchte einen Bericht, der eine einzige Zeile pro Asset zeigt alle Spalten hat.
Mein aktueller Bericht zeigt alle erforderlichen Informationen, aber es zeigt alle Zeilen pro Asset anstelle eines einzelnen eingekapselten Reihe, zum Beispiel:

ASSET NO | FINANCIER | AGEEMENT NUMBER | PAYMENT NUMBER | LEASE COMMENCE DATE | LEASE FINAL DATE | MONTHLY PAYMENTS 
asset1 | bank 1 | 1111 | 1 | 01/01/2017 | NULL | NULL 
asset1 | bank 1 | 1111 | 2 | NULL | NULL | 2000 
asset1 | bank 1 | 1111 | 3 | NULL | NULL | NULL 
.. 
asset1 | bank 1 | 1111 | 20 | NULL | 01/01/2020 | NULL 
asset2 | bank 5 | 1536 | 1 | 05/08/2016 | NULL | NULL 
.. 

Statt:

ASSET NO | FINANCIER | AGEEMENT NUMBER | PAYMENT NUMBER | LEASE COMMENCE DATE | LEASE FINAL DATE | MONTHLY PAYMENTS 
    asset1 | bank 1 | 1111 | 20 | 01/01/2017 | 01/01/2020 | 2000 
    asset2 | bank 5 | 1536 | 15 | 05/08/2016 | 12/05/2019 | 5500 
    .. 

Unten ist meine Frage:

Declare @MaxPays TABLE (
    ITEMNO VARCHAR(MAX), 
    PAYNO VARCHAR(MAX) 
) 

INSERT INTO @MaxPays 
SELECT 
    a.ITEMNO, 
    a.PAYNO 
FROM 
    [DATABASE1] a 
INNER JOIN 
    (SELECT ITEMNO, MAX(PAYNO) as PAYNO FROM [DATABASE1] GROUP BY ITEMNO) AS b ON 
    a.ITEMNO = b.ITEMNO AND a.PAYNO = b.PAYNO 

SELECT 
    a.ITEMNO as 'Asset #', 
    a.FINANCE as 'Financier', 
    a.AGREENO as 'Agreement number', 
    a.PAYNO as 'Payment Number', 
     CASE WHEN a.PAYNO = 1 THEN a.PAYDATE ELSE NULL END as 'Lease Commencing Date', 
     CASE WHEN a.PAYNO = (SELECT PAYNO FROM @MaxPays WHERE ITEMNO = a.ITEMNO) THEN a.PAYDATE ELSE NULL END as 'Lease Finalising Date', 
     CASE WHEN a.PAYNO = 2 THEN a.PAYAMOUNT ELSE NULL END as 'Monthly Payments' 
FROM 
    [DATABASE1] a 
INNER JOIN 
    (SELECT DISTINCT ITEMNO from [DATABASE2]) AS b ON 
    a.ITEMNO = b.ITEMNO 
ORDER BY a.ITEMNO 

EDIT: die monatliche Zahlung von Links auf die zweite Instanz, weil irgendwann s Die erste Zahlung beinhaltet Anzahlungen und ist kein klarer Indikator für die wiederkehrenden monatlichen Zahlungen

Jede Hilfe wäre willkommen.

Dank

+0

Zunächst sollten Sie die 'RDMS' statt nur' sql' markieren. Zurück zu Ihrer Frage müssen Sie 'GROUP BY' verwenden, jedoch kann ich die Antwort nicht liefern, da ich Ihre Logik nicht verstehe; Das Mietbeginn-Datum scheint 'min' zu sein, das Leasing-Finalisierungsdatum scheint' max', aber die monatlichen Zahlungen ... – Prisoner

+0

Danke für die Kommentare, sorry, ich hätte klarstellen sollen. Die monatliche Zahlung bezieht sich auf die zweite Instanz, da manchmal die erste Zahlung Anzahlungen enthält und kein klarer Indikator für die wiederkehrenden monatlichen Zahlungen ist. Danke – Daniel

+0

Vielleicht habe ich Sie verwirrt, 'RDMS' nicht das' RDMS'-Tag meine ich, aber etwas wie 'sql-server',' oracle', 'mysql'. Und meinst du, monatliche Zahlungen sollten der Wert des letzten Datensatzes sein, der dem Max (Lease-Abschlussdatum) entspricht? – Prisoner

Antwort

0

Sie brauchen nur eine kleine Änderung in der Abfrage -

SELECT 
a.ITEMNO as 'Asset #', 
a.FINANCE as 'Financier', 
a.AGREENO as 'Agreement number', 
a.PAYNO as 'Payment Number', 
MAX(CASE WHEN a.PAYNO = 1 THEN a.PAYDATE ELSE NULL END) as 'Lease Commencing Date', 
MAX(CASE WHEN a.PAYNO = (SELECT PAYNO FROM @MaxPays WHERE ITEMNO = a.ITEMNO) THEN a.PAYDATE ELSE NULL END) as 'Lease Finalising Date', 
MAX(CASE WHEN a.PAYNO = 2 THEN a.PAYAMOUNT ELSE NULL END) as 'Monthly Payments' 
FROM 
[DATABASE1] a 
INNER JOIN 
(SELECT DISTINCT ITEMNO from [DATABASE2]) AS b ON 
a.ITEMNO = b.ITEMNO 
GROUP BY a.ITEMNO, 
     a.FINANCE, 
     a.AGREENO, 
     a.PAYNO, 
ORDER BY a.ITEMNO 
+0

Es scheint, dass dies einen Fehler auslöst: "Nachricht 130, Ebene 15, Status 1, Zeile 22 Kann keine Aggregatfunktion für einen Ausdruck ausführen, der ein Aggregat oder eine Unterabfrage enthält" – Daniel

Verwandte Themen