2016-05-03 7 views
0

Ich versuche Code zu schreiben, der jeden Monat eine Liste ziehen wird. Die Liste zieht mehrere Datensätze für jeden Kunden und ich brauche die Ergebnismenge, um eine Zeile für jeden Kunden mit einer Vielzahl von aggregierten Informationen zurückzugeben.Erstellen einer monatlichen Liste mit einer Zeile aus mehreren Datensätze pro Kunde

So, wenn ich den folgenden Code ausführen, bekomme ich die richtige Antwort für Max Datum gibt mir die letzte Rechnung für diesen Kunden und ich bekomme die richtige Antwort auf Summe Summe aller noch offenen Rechnungen. Es wird weitere Felder geben, die das Altern auf dem Konto zeigen. Aber ich bekomme so viele Zeilen pro Kunde, wie ich Rechnungen habe, wobei jede Zeile die "richtige" Antwort auf die beiden aggregierten Felder anzeigt.

Ich begann mit dem Nachschlagen Distinct und kann sehen, dass die meisten Antworten mit Windowing-Funktionen zurückkommen. Ich habe sie vorher nicht benutzt und ich bin verwirrt darüber, dass sie funktionieren. Die Ausgabe muss in einer bestimmten Reihenfolge sein, weshalb ich Dinge so aufgelistet habe, wie ich es tue. An diesem Punkt habe ich so viele Hilfe-Foren gelesen, dass ich mich betrunken fühle, also denke ich, dass mir eine offensichtliche Antwort fehlt.

SELECT cl.[document type] AS [RecordType], 
     c.[no_], 
     c.[name], 
     c.[name 2], 
     c.[address], 
     c.[address 2], 
     c.city, 
     c.[post code] AS [Zip], 
     c.[county] AS [State], 
     c.[country_region code] AS CountyTrim, 
     Month(Getdate()) AS [FigMonth], 
     Day(Getdate()) AS [FigDay], 
     Year(Getdate()) AS [FigYear], 
     --Next 2 lines should pull last invoice for customer to fill LastSaleDate field 
     (
     SELECT Max(cl2.[posting date]) 
     FROM [dbo].[detailed cust_ ledg_ entry] AS cl2 
     WHERE cl2.[document type] = 2 AND cl2.[customer no_] = c.[no_] 
     ) AS [LastSaleDate], 
     c.[payment terms code] AS [Terms 1], 
     --iif instead of case to fill Terms1Open field 
     Iif (c.[payment terms code] = 'CreditCard/Pre-Auth', 'N', 'Y') AS [Terms1Open], 
     --Now totaling invoices per customer 
     (
     SELECT Sum(cl3.[amount]) 
     FROM [dbo].[detailed cust_ ledg_ entry] AS cl3 
     WHERE cl3.[customer no_] = c.[no_] 
     GROUP BY cl3.[customer no_] 
     ) AS [DollarsTotal] 
FROM [dbo].[customer] AS c 
JOIN [dbo].[detailed cust_ ledg_ entry] AS cl 
    ON c.[no_] = cl.[customer no_] 
JOIN [dbo].[cust_ ledger entry] AS l 
    ON l.[document no_] = cl.[document no_] 
WHERE l.[open] = 1 
     AND cl.[document type] = 2 
     AND c.[customer posting group] IN ('BIKECUST', 'OUTDRCUST') 
ORDER BY c.[no_] 
+1

Diese Formatierung bringt mich dazu, meine Augäpfel herauszunehmen und sie mit einem Sandstrahler zu erschießen. Manchmal ist der Alias ​​auf derselben Zeile, manchmal nicht. 10 Minuten aufzuräumen, wäre der erste Schritt. Schritt 2 erhält Hilfe von einem Online-Forum. Für diesen Prozess sollten Sie hier beginnen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

Autsch! Höre, was du gesagt hast. Wird versuchen, es besser zu machen. Ich habe viele Antworten hier gefunden, also war es einer der ersten Orte, an die ich mich wandte. – cjs

Antwort

0

Ich bin mir nicht ganz sicher, was Sie zu tun versuchen, aber basierend auf dem SQL habe ich neu geschrieben, es zu tun, was ich denke, der Code am besten als logisches beschrieben.

Wenn ich einen Vorschlag vorschlagen kann, wenn dies Ihr eigenes Schema ist - würde ich ernsthaft über die Umbenennung wörtlich alles nach Best Practices denken.

SELECT CL.[document type] AS [RecordType] 
     ,C.[no_] 
     ,C.[name] 
     ,C.[name 2] 
     ,C.[address] 
     ,C.[address 2] 
     ,C.city 
     ,C.[post code] AS [Zip] 
     ,C.[county] AS [State] 
     ,C.[country_region code] AS CountyTrim 
     ,Month(Getdate()) AS [FigMonth] 
     ,Day(Getdate()) AS [FigDay] 
     ,Year(Getdate()) AS [FigYear] 
     ,MAX(CL.[posting date]) AS [LastSaleDate] 
     ,C.[payment terms code] AS [Terms 1] 
     ,CASE WHEN C.[payment terms code] = 'CreditCard/Pre-Auth' 
       THEN 'N' 
       ELSE 'Y' END AS [Terms1Open] 
     ,SUM(CL.[amount]) AS [DollarsTotal] 
    FROM dbo.Customer C 
    JOIN dbo.[detailed cust_ ledg_ entry] CL 
    ON C.[no_] = CL.[customer no_] 
    JOIN dbo.[cust_ ledger entry] L 
    ON L.[document no_] = CL.[document no_] 
WHERE L.[open] = 1 
    AND CL.[document type] = 2 
    AND C.[customer posting group] IN ('BIKECUST', 'OUTDRCUST') 
GROUP 
    BY CL.[document type] 
     ,C.[no_] 
     ,C.[name] 
     ,C.[name 2] 
     ,C.[address] 
     ,C.[address 2] 
     ,C.city 
     ,C.[post code] 
     ,C.[county] 
     ,C.[country_region code] 
     ,Month(Getdate())            
     ,Day(Getdate())             
     ,Year(Getdate())  
     ,CASE WHEN C.[payment terms code] = 'CreditCard/Pre-Auth' 
       THEN 'N' 
       ELSE 'Y' END 
    ORDER 
    BY C.[no_] 
+0

Danke. Mein Schema und mein Problem waren offensichtlich nicht meine Arbeit, sondern das Schema, mit dem ich arbeiten musste. Diese Antwort wird es mir ermöglichen, mit dem Rest voranzukommen. Ich werde versuchen, meine Anfragen besser zu formulieren. – cjs

+0

Ich bin nur froh, dass ich die Logik gut genug gelesen habe, um den Ball für dich ins Rollen zu bringen! – EastOfJupiter

Verwandte Themen