2016-12-14 3 views
3

In der folgenden Abfrage möchte ich alle Zeilen (Lieferantenrechnungen) ausschließen, wenn es eine andere Zeile mit der gleichen Job-ID und einer entgegengesetzten Rechnungssumme gibt. Wenn der Auftrag 1234 z. B. Kreditorenrechnungen in den Beträgen -10, 10 und 20 enthält, sollte nur der Wert 20 in den Abfrageergebnissen zurückgegeben werden. Wenn ein Job Rechnungen im Wert von -10, 10, 10 und 20 hat, sollten die Ergebnisse idealerweise die 20 Rechnung und die 10 Rechnung mit dem ältesten Rechnungsdatum zurückgeben.sql exclude offsetting rows

SELECT J.JobID, 
    VI.VendorInvoiceNo, 
    VI.invoicetotal, 
    VI.importedDate, 
    VI.CreationDate, 
    VI.InvoiceDate 

FROM VendorInvoices AS VI 
    LEFT JOIN Jobs AS J ON J.JobID = VI.JobID 

WHERE J.operCompleteDate >= (GETDATE()-90) 
    AND VI.invoicetotal IS NOT NULL 
    AND VI.invoicetotal <> 0 
+1

Sie verwenden nicht sowohl MySQL als auch Sql Server, also entfernte ich diese Tags. Bitte fügen Sie nur das Tag des RDMS zurück, das Sie verwenden. –

+0

Die Verwendung von 'getdate()' führt mich zu der Annahme, dass Sie SQL Server verwenden. –

Antwort

3

Ihre Anfrage ist im Grunde:

SELECT vi.* 
FROM VendorInvoices vi LEFT JOIN 
    Jobs J 
    ON J.JobID = VI.JobID 
WHERE J.operCompleteDate >= (GETDATE()-90) AND 
     vi.invoicetotal IS NOT NULL 
     vi.invoicetotal <> 0; 

Wenn wir dies als ein CTE verwenden:

WITH vi as (
     SELECT vi.* 
     FROM VendorInvoices vi LEFT JOIN 
      Jobs J 
      ON J.JobID = VI.JobID 
     WHERE J.operCompleteDate >= (GETDATE()-90) AND 
      vi.invoicetotal IS NOT NULL 
      vi.invoicetotal <> 0 
    ) 
SELECT vi.* 
FROM vi 
WHERE NOT EXISTS (select 1 
        from vi vi2 
        where vi2.jobid = vi.jobid and 
         vi2.invoicetotal = - vi.invoicetotal 
       ); 
0

Keine Notwendigkeit, einen CTE für diesen Einsatz. Das bringt nur zusätzlichen Aufwand. Beziehen Sie sich einfach zweimal auf die Tabelle in der Abfrage.

Ein Index für JobID und InvoiceTotal sorgt für maximale Verarbeitungsgeschwindigkeit, ist aber möglicherweise nicht erforderlich.