2017-02-07 5 views
0

Ich habe eine zwei Tabellen: "Rechnung" als I und "Debitoren" als AR.SQL Tabelle Beitritt Ausgabe

AR Tabelle enthält Rechnung ausgestellt (mit ID 0) und Bargeld erhalten (mit ID 4), während I Tabelle Rechnungsbetrag Spalte und Anpassung Spalte enthält.

Abgesehen von regelmäßigen Rechnungen und Anpassungen gibt es Fälle, in denen Anpassungen an der Rechnung vorgenommen wurden und der Nettoeffekt 0,00 in der Tabelle AR beträgt. Außerdem werden Rechnungen manchmal vor dem Buchen in der Rechnungstabelle erstellt und abgeschrieben, so dass AR einen Betrag von 0,00 in AR hat, aber I Tabelle einen Betrag von 100 US-Dollar und - 100 US-Dollar in Anpassung hat.

Ich versuche, eine Abfrage zu erstellen, wo es mir ausgegebene Rechnung und Bargeld erhalten nebeneinander und erstellen Sie auch eine neue Spalte, die Anpassung für Rechnungen mit 0,00 Balance in AR enthält. Spalten, die helfen könnten:

AR.ID = unique ID 
AR.ARinvnumber= Invoice number from Invoice table 
Ar.Type= 0=invoice, 1 = payment received 
Ar.Amount= ARamount saved from invoice 
I.Id= unique ID 
Invoice number = number of invoice 
Invamount= Actual invoice amount 
Inv Adjustment= Adjustment applied on invoice 

Irgendeine Idee, wie ich das erreichen kann? Ich bin in der Lage I und AR Tisch und Bargeld und AR aus AR Tabelle dieses

Select * 
From (select ar.customerId, ar.customername,ar.invnumber ar.amount, i.invamout, i.invadjustment from Ar join I on ar.arinvnumber=i.invoicenumber where ar.artype=1) inv 
join 
select (select ar.customerId, ar.customername, ar.invnumber ar.amount, i.invamout, i.invadjustment from Ar join I on ar.arinvnumber=i.invoicenumber where ar.artype=1) cash 

on inv.invnumber=cash.invnumber and inv.customerid=cash.customerid 

nach dem Aufstehen passen, wie kann ich schließe jene Rechnungen, für die Anpassung vorgenommen wurde, aber es gab keine AR weil Anpassung Rechnungsbetrag entspricht.

Antwort:

Die folgende Antwort funktionierte für mich. Grundsätzlich wollte ich alle Anpassungen aus der Rechnungstabelle einbeziehen, einschließlich derjenigen, die nicht in der AR-Tabelle enthalten sind, da die Anpassungen vorgenommen wurden, um das Konto des Kunden in Bezug auf die Arbeit nach der letzten Rechnung freizugeben. Ich habe folgende Abfrage

Select * 
From (select AR.ARInvnum as ARInvnum, AR.Arclientnumber as Aclient, sum(AR.Amount), I.Invoicenumber,  sum(distinct(I.IAmount)), sum(I.IAdjust) 
    From AR.ARInvnum=I.Invoicenumber 
    Where ar.artype=0 
Group by AR.ARInvnum, I.Invoicenumber, AR.Arclientnumber)AInvoice 
Left join 
    (select AR.ARInvnum as PARInvnum, AR.Arclientnumber as PClient,  sum(AR.Amount), I.Invoicenumber, sum (I.IAmount), sum(I.IAdjust) 
    From AR.ARInvnum=I.Invoicenumber 
    Where ar.artype=4 
Group by AR.ARInvnum, I.Invoicenumber, AR.ARclientnumber)PInvoice 
on 
AInvoice.ARInvnum=PInvoice.PARInvnum 
and 
AInvoice.Aclient=PInvoice.PClient 

Keep in Mind die Distinct Klausel im ersten Teil der Unterabfrage alle Duplikate entfernt sowie summieren sie, so dass es wie eine Zusammenfassung in Bezug auf bestimmte Rechnungsnummer suchen. Der erste Teil der Unterabfrage fasst die Rechnungsprobleme und die Anpassungen des Kunden zusammen. und der zweite Teil entspricht allen erhaltenen Zahlungen. Ich hoffe das hilft.

Antwort

0

Sie müssen eine Begrenzungsklausel einschließen, die auch als Where-Klausel bezeichnet wird. MSDN-Dokumentation auf select legt die Syntax wie folgt:

SELECT select_list [ INTO new_table ] 

[ FROM table_source ] [ WHERE search_condition ] 

[ GROUP BY group_by_expression ] 

[ HAVING search_condition ] 

[ ORDER BY order_expression [ ASC | DESC ] ] 

Beachten Sie, werden Sie nicht jeden Ausdruck benötigen eine gültige SELECT-Anweisung zu erstellen. Außerdem müssen Sie nicht dieselbe Abfrage mit sich selbst verknüpfen. Warum nicht vereinfachen, indem Sie die Abfrage selbst ausführen?

select 
    ar.customerId, ar.customername, ar.invnumber, 
    ar.amount, i.invamout, i.invadjustment 
from Ar 
    join I on ar.arinvnumber=i.invoicenumber 
where ar.artype=1 

Aber Ihre Fragen stellen, wie die Ergebnisse

diese Rechnungen nur zu begrenzen, für die Einstellung vorgenommen wurde, aber es gab keine [Forderung]

Aktualisieren Sie Ihre where-Klausel etwas wie

where ar.artype=1 and i.adjustment is not null and i.adjustment = i.invamount 

Dies wird die Ergebnisse einschränken eturned durch die select Anweisung nur die Datensätze, die alle drei der folgenden Kriterien erfüllen:

  1. artype gleich 1
  2. Einstellung nicht null
  3. Einstellung ist gleich invamount

Wenn diese Ergebnismenge zu klein ist, optimieren Sie Ihre where-Klausel. Ich finde es hilfreich, einen einzelnen Datensatz zu identifizieren, der wie andere Datensätze aussieht, die ich gerne finden würde. Verwenden Sie diese eindeutige Kennung, um festzustellen, ob Ihre Abfrage wie erwartet funktioniert.

+0

Danke Nathan, ich habe versucht, aber es hat nicht funktioniert. Also nahm ich das Ergebnis und erstellte eine neue Tabelle, als ich die zweite Abfrage ausführte und dem Ergebnis beitrat. Es funktionierte. Danke für Ihre Unterstützung. – Invisible