Ich habe eine Anfrage, die dazu führt, dass eine Kundenrechnung auf unserem SSRS 2008 R2 Server erstellt wird. Die SQL Server-Instanz ist auch 2008 R2. Die Abfrage ist groß und ich möchte nicht das gesamte Ding aus Sicherheitsgründen usw. veröffentlichen.
Was ich mit den folgenden Beispieldaten tun muss, ist, die zwei Zeilen mit 73.19 und -73.19 aus der Ergebnismenge zu entfernen. Wenn also zwei Zeilen in der Spalte "LineBalance" denselben absoluten Wert haben und ihre Summe 0 ist UND sie in der Spalte REF1 denselben Wert haben, sollten sie aus der Ergebnismenge entfernt werden. Die Zeile mit REF1 = 14598 und einem Zeilensaldo von 281.47 sollte immer noch in der Ergebnismenge zurückgegeben werden und die anderen zwei Zeilen darunter mit REF1 = 14598 sollten nicht zurückgegeben werden.
Der Sinn dahinter ist es, Buchungsfehler und deren Korrektur vor dem Kunden zu "verstecken". von "verstecken" ich meine, nicht auf der Rechnung, die sie in der Post bekommen. Was hier passiert ist, dass der Kunde fälschlicherweise 73,19 in Rechnung gestellt wurde, wenn sie 281,47 in Rechnung gestellt hätten. Also, unsere AR Abteilung. brachte 73.19 auf ihr Konto zurück und berechnete ihnen den korrekten Betrag von 281.47. Wie Sie sehen können, haben sie alle den gleichen REF1-Wert.
Die meisten AR / Abrechnungssysteme behandeln "Gutschriften" (den negativen Betrag) ähnlich wie Bargeld, wobei in diesem Fall die -73,19 auf die 73,19 LineBalance
genauso angewandt würde, als wenn der Kunde diesen Betrag bezahlt hätte ein Guthaben von $ 0.
OPTION 1:
Gehen Sie in diesem System mit Kassenbons und Anwendungen um? Wenn dies der Fall ist, können Sie möglicherweise Daten aus diesen Geldanwendungstabellen abrufen, um die Verbindung zwischen SysInvNum 3344296 und 3341758 anzuzeigen.
OPTION 2:
Ich gehe davon aus, dass die Spalte PayAdjust
verwendet wird, um den Saldo zu reduzieren, nachdem ein Kunde bezahlt hat, und dass LineBalance eine berechnete Spalte ist, die Charges + PayAdjust
ist.
In den meisten Fällen ist die AR-Abteilung dafür verantwortlich, die Gutschrift auf eine offene Rechnung anzuwenden, sodass die Spalte " PayAdjust
" zwischen den beiden Zeilen einen Wert von $ 0 ergibt, was zu LineBalance
führt. um auch $ 0 auf jeder der 2 Reihen zu sein. Es kann nur ein Trainingsproblem für das System sein, das verwendet wird.
Dies würde dazu führen, dass die drei fraglichen Zeilen so aussehen, dass Sie kein Problem haben. Sie würden die Zeilen einfach ausschließen, indem Sie where LineBalance <> 0
zu Ihrer Abfrage hinzufügen, seit die AR-Abteilung (die das Guthaben angewendet hat) beginnt mit und so weiß die Antwort auf diese Frage) explizit angegeben, welche LineBalance
der Kredit gilt für:
Option 2 Bevorzugte Datenstruktur:
%Vor%OPTION 3:
Ohne diese Daten aus Option 1 oder 2 haben Sie viele Annahmen getroffen und laufen Gefahr, versehentlich die falschen Zeilen zu verbergen.
Hier ist eine Abfrage, die versucht, das zu tun, was Sie fragen, aber ich würde sehr empfehlen, mit der AR-Abteilung zu überprüfen, ob sie "PayAdjust" für diese Datensätze aktualisieren können.
Ich habe mehrere Testfälle von Szenarien hinzugefügt, die Probleme verursachen könnten, aber dies deckt möglicherweise nicht alle Grundlagen ab.
Diese Abfrage blendet nur Zeilen aus, in denen ein bestimmter passender negativer Wert für einen positiven Wert gefunden wird, für denselben REF1 und denselben Fälligkeitsdatum. Außerdem wird sichergestellt, dass die ursprüngliche Rechnungsrechnungs-ID vor der Gutschrift liegt, da angenommen werden kann, dass vor der tatsächlichen Belastung keine Gutschrift erfolgt (Testfall 6 zeigt beide Zeilen, da die Gutschrift vor der Belastung eine SysInvNum aufweist) ). Wenn mehr als eine Übereinstimmung pro REF1, DueDate, and LineBalance
gefunden wird, werden die entsprechenden Gebühren- und Kreditlinien (Testfälle 2 und 4) nicht ausgeblendet. Testfall 3 summiert sich insgesamt auf 0, zeigt aber immer noch alle 3 Zeilen an, da die LineBalance-Werte nicht exakt übereinstimmen. Dies sind alles Annahmen, die ich getroffen habe, um Randfälle zu behandeln, so dass sie nach Bedarf angepasst werden können.
Ich würde ein Feld hinzufügen, das ein explizites Flag enthält, das besagt, dass eine bestimmte Ladung ein Fehler / eine Umkehrung eines Fehlers war, und dann ist es einfach, solche Zeilen herauszufiltern. Wenn Sie es im laufenden Betrieb tun, könnten Ihre Berichte eher langsam werden.
Aber um das gegebene Problem zu lösen, können wir es so machen. Die Lösung geht davon aus, dass SysInvNum
eindeutig ist.
Ich habe einige weitere Fälle hinzugefügt, die mehrere Fehler enthalten.
Dies ist die Ergebnismenge:
%Vor%Sie können sehen, dass Zeilen mit Fehlern zählen & gt; 1. Auch Fehlerpaare haben die gleiche Zeilennummer. Also müssen wir die Zeilen mit count & gt; 1 und diejenigen, die zwei gleiche Zeilennummern haben.
Dies ist ein weiteres Zwischenergebnis:
%Vor%Nun, wir haben das alles zusammengefügt.
Ergebnis:
%Vor%Beachten Sie, dass das Endergebnis keine Zeilen mit REF = 300 enthält, da zwei korrigierte Fehler aufgetreten sind, die sich vollständig ausgeglichen haben.
Diese Lösung funktioniert nur für SQL Server 2012 , entschied sich jedoch, sie hier zu belassen, wenn jemand in der Zukunft etwas Ähnliches tun muss, weil es ziemlich einfach ist.
....
Dies sollte nur zwei Transaktionen für bestimmte Empfänger entfernen, wenn ihre Summe 0 ist und es keine anderen Transaktionen zwischen ihnen gibt (und die negative Transaktion erfolgt nach positiver Transaktion). Es ist konservativer und sicherer.
Es sollte Informationen über die Reihenfolge der Transaktionen geben. So etwas wie Datumsspalte. Dann sollten Sie anstelle der PRIMARY KEY-Spalte in der PARTITION BY-Anweisung nach dieser Spalte sortieren.
%Vor%Tags und Links sql sql-server