SQL 2008 laufende Summen und Nullsätze

stimmen
0

Ich habe mehrere Anfragen, die Kontostände aus unserer erp erhalten, aber es gibt einige Probleme Ich versuche, um zu arbeiten, und ich bin gespannt, ob es bessere Möglichkeiten gibt, oder wenn neuere Versionen von SQL Server Funktionen eines dieser Probleme zu lösen.

  • Unser ERP erzeugt ein ausgewogenes Verhältnis Datensatz nur in Zeiten, in denen es Tätigkeit mit dem Konto verknüpft ist. Die ERP-Anwendungen und Berichte zusammenfassen Werte von Zeit, aber kein Datensatz in die Datenbank hinzugefügt, so benutzerdefinierte Prozesse, die eine Balance von Zeit benötigen eine Abfrage / Ansicht benötigen diese Informationen zu berechnen. Meine Abhilfe für dies hat eine globale Variable zu verwenden, um absichtlich Duplikate aus der Konto-Tabelle zu erstellen und die psudo Periode Tabelle I erstellt, siehe unten.
  • Unsere Konto Periode Tabelle nicht über einen Zeitraum Index enthält Dosis (ich nehme an, es die Zeilen-ID jedoch eine Steuerperiode falsch und der Index wurde aus der Ordnung geworfen. Ich habe von dem ERP-Anbieter informiert wurde nicht aktualisiert werden diese wurde zu einem bestimmten Zeitpunkt sein sollte hinzugefügt ohne eine vollständige Neuimplementierung). Ich habe für diese eine Abhilfe Tabelle.

So habe ich mehrere Anfragen, die um diese Probleme arbeiten, aber sie laufen slowley mit nur einer Handvoll von Konten so eine vollständige psudo Tabelle für Kontostände hat mit meinen Methoden zumindest nicht praktikabel gewesen. Ich habe für die Berechnung der Balance von Zeit für Konten ein Beispiel unten enthalten, die auf den Gewinnrücklagen sind nicht anually zusammengefasst (Aktiva, libalities, Eigenkapital)

SELECT ID AS ACCOUNT_ID, ind.Month_Index, ind.Period,

       (
        SELECT ISNULL(SUM(CASE WHEN A3.TYPE IN ('e','r') THEN NULL
                               WHEN A3.TYPE = 'a' THEN ISNULL(AB3.DEBIT_AMOUNT,0) - ISNULL(AB3.CREDIT_AMOUNT,0) 
                               ELSE ISNULL(AB3.CREDIT_AMOUNT,0) - ISNULL(AB3.DEBIT_AMOUNT,0) END),0)

        FROM ACCOUNT_BALANCE AS AB3
        LEFT OUTER JOIN ACCOUNT AS A3
        ON AB3.ACCOUNT_ID = A3.ID
        LEFT OUTER JOIN (
                         SELECT YEAR, Month_Num, Month_Index, Period
                         FROM UFC_Calander 
                         GROUP BY YEAR, Month_Num, Month_Index, Period
                        ) AS ind2
        ON AB3.ACCT_YEAR = ind2.YEAR AND AB3.ACCT_PERIOD = ind2.Month_Num
        WHERE A.ID = AB3.ACCOUNT_ID AND A3.CURRENCY_ID = '(USA) $' AND ind2.Month_Index <= ind.Month_Index
       ) AS BALANCE_AQL

FROM ACCOUNT AS A
LEFT OUTER JOIN ACCOUNT_PERIOD AS per
ON 'UCC' = per.SITE_ID
LEFT OUTER JOIN ACCOUNT_BALANCE AS AB
ON A.ID = AB.ACCOUNT_ID AND per.ACCT_YEAR = AB.ACCT_YEAR AND per.ACCT_PERIOD = AB.ACCT_PERIOD AND AB.CURRENCY_ID = '(USA) $'
LEFT OUTER JOIN (
                 SELECT YEAR, Month_Num, Month_Index, Period
                 FROM UFC_Calander 
                 GROUP BY YEAR, Month_Num, Month_Index, Period
                 ) AS ind
ON per.ACCT_YEAR = ind.YEAR AND per.ACCT_PERIOD = ind.Month_Num

WHERE ID IN  ('120-1140-0000','120-1190-1190','120-1190-1193','120-1190-1194','210-2100-0000','210-2101-0000') 

GROUP BY ID, ind.Month_Index, ind.Period

ORDER BY ind.Month_Index DESC, ACCOUNT_ID DESC

Irgendwelche sugestions, die die Leistung dieser Abfrage verbessern können wird sehr geschätzt.

Veröffentlicht am 09/10/2019 um 19:03
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Meine hohe Empfehlungen sind folgende:

  • Vermeiden Sie die IN-Klausel. Wenn möglich (die Kontentabelle unter der Annahme, nicht zu groß ist, erstellen Sie eine temporäre Tabelle nur für die Spalten, die Sie benötigen und lädt diese Daten mit der ID dem Sie arbeiten.) Dann die oben in Ihrem Code verwenden.

  • (Kein Leistungs Sache aber eher eine leichte Veränderung). Die ISNULL (SUM ... ist Teil nur wegen Sie braucht ein „A3.TYPE IN (‚e‘,‚r‘) THEN NULL“ hat. Wenn man dann gesagt hatte 0, könnten Sie die NULL-Prüfung vermeiden.

  • Eine korrelierte Unterabfrage innerhalb der select ist in Ordnung, aber es ist ein mehrteiliger verbinden, dass höchstwahrscheinlich verursacht es zu verlangsamen. Ich bin nicht sicher, 100% sicher, wie Sie diese auseinander brechen können zwei separate logische Grabs von Daten zu sein und dann wieder zusammengefügt werden, aber es ist das Beste, was ich bekam mit, was ich sehe hier.

Beantwortet am 09/10/2019 um 23:16
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more