2

Ich habe eine SALES_RECEIPT Tabelle und eine (Verkaufs-) RETURNS Tabelle, die beide REP_ID als Fremdschlüssel aus der SALES_REP Tabelle haben. Ich möchte den Gesamtumsatz und die Gesamtrendite für jeden Vertriebsmitarbeiter summieren und die Provision aus den Verkäufen und die verlorene Provision aus den Retouren berechnen.Aggregatberechnungen aus 2 separaten Tabellen

Die Abfrage wird ohne Fehler ausgeführt, aber die Werte in den Spalten stimmen nicht. Die Werte sind viel größer als die tatsächlichen Werte. Ich versuchte sowohl INNER JOIN als auch LEFT JOIN, um die RETURNS-Tabelle zu verknüpfen, aber das behob das Problem nicht.

SELECT Format(SALES_RECEIPT.SALE_DATE,'yyyy-mm') AS [Year-Month], 
SALES_REP.rep_Name, 

Sum(SALES_RECEIPT.SELLING_PRICE*SALES_RECEIPT.quantity) AS [Total Sales], 
Sum((Nz(SALES_RECEIPT.SELLING_PRICE,0)*Nz(SALES_RECEIPT.quantity,0))*(Nz(SALES_RECEIPT.commission_percent,100)*0.001)) AS [Gross Commission], 
Sum(Nz(returns.selling_price * returns.quantity)) AS [Returns Sales], 
Sum(Nz(returns.selling_price*returns.quantity)) AS [Returns Sales], Sum((Nz(RETURNS.SELLING_PRICE,0)*Nz(RETURNS.quantity,0))*(Nz(RETURNS.commission_percent,100)*0.001)) AS [Lost Commission], 
Sum((Nz(SALES_RECEIPT.SELLING_PRICE,0)*Nz(SALES_RECEIPT.quantity,0))*(Nz(SALES_RECEIPT.commission_percent,100)*0.001))-Sum((Nz(RETURNS.SELLING_PRICE,0)*Nz(RETURNS.quantity,0))*(Nz(RETURNS.commission_percent,100)*0.001)) AS [Net Commission] 

FROM 
(SALES_RECEIPT INNER JOIN SALES_REP ON SALES_RECEIPT.REP_ID = SALES_REP.REP_ID) 
LEFT JOIN RETURNS ON SALES_RECEIPT.REP_ID = RETURNS.REP_ID 
WHERE (((SALES_RECEIPT.SALE_DATE) Between #1/1/2000# And #12/31/2050#)) 
GROUP BY Format(SALES_RECEIPT.SALE_DATE,'yyyy-mm'), SALES_REP.rep_Name; 
+0

Debuggen Sie es, indem Sie die RETURNS nur für einige Verkäufe summieren: 'SELEct Sum (Nz (returns) .selling_price * returns.quantity)) AS [Gibt Verkäufe zurück] FROM RETURNS WHERE REP_ID IN (hier einige Verkaufs-IDs setzen) GROUP BY REP_ID' ​​und prüfen, ob die zurückgegebenen Nummern korrekt sind –

+0

Der folgende Code hat korrekte Werte für "Return Sales" aber Wie man alles in derselben Abfrage macht, ist der schwierige Teil. SELECT-Format (returns.return_DATE, 'yyyy-mm') AS [Jahr-Monat], SALES_REP.rep_Name AS [Verkaufsperson], Summe (Nz (returns.selling_price * returns.quantity)) AS [Verkauf zurückgibt] FROM RETURNS INNER JOIN SALES_REP AUF RETURNS.REP_ID = SALES_REP.REP_ID WHERE RETURNS.RETURN_DATE Zwischen # 1/1/2000 # Und # 12/31/2050 # GROUP BY Format (RETURNS.RETURN_DATE, 'yyyy-mm'), SALES_REP .rep_Name; –

+0

Sorry ... kein Access-Guru ... sieht so aus, als ob Sie am Ende der Auswahl auch Semikolon benötigen. Ich habe es ein letztes Mal bearbeitet. Lass mich wissen wie es funktioniert. –

Antwort

0

Edited for Access (versucht Syntax zu beheben)

Unter der Annahme, dass die RETURNS Tabelle in die SALES_RECEIPT Tabelle einen Schlüssel-ID hat?

Zuerst ziehen die SalesReceipt Zeichnet alle basierend auf Date Range dann alle RETURNS Ziehen am gleichen Datumsbereich basierend

WITH totSales as 
(
    SELECT 
     sr.SalesReceiptID 
     ,sr.REP_ID 
     ,Format(sr.SALE_DATE,'yyyy-mm') AS [Year-Month] 
     ,(sr.SELLING_PRICE * sr.quantity) AS [Total Sales] 
     ,((Nz(sr.SELLING_PRICE, 0) * Nz(sr.quantity, 0)) * (Nz(sr.commission_percent, 100) * 0.001)) AS [Gross Commission] 
    FROM 
     SALES_RECEIPT sr 
    WHERE 
     sr.SALE_DATE Between #1/1/2000# And #12/31/2050# 
) 

,totReturns as 
(
    SELECT 
     r.REP_ID 
     ,(Nz(returns.selling_price * returns.quantity)) AS [Returns Sales] 
     ,((Nz(RETURNS.SELLING_PRICE, 0) * Nz(RETURNS.quantity, 0)) * (Nz(RETURNS.commission_percent, 100) * 0.001)) AS [Lost Commission] 
    FROM 
     RETURNS r 
    WHERE 
     r.RETURN_DATE Between #1/1/2000# And #12/31/2050# 
) 

Select 
    ts.Year-Month 
    ,sr.REP_Name 
    ,SUM(ts.[Total Sales]) as 'TotSales' 
    ,SUM(ts.[Gross Commission]) as 'TotCommissions' 
    ,SUM(ISNULL(tr.[Return Sales],0) as 'TotReturnSales' 
    ,SUM(ISNULL(tr.[Lost Commission],0) as 'TotLostCommissions' 
From totSales ts 
LEFT JOIN totReturns tr on tr.SalesReceiptID = ts.SalesReceiptID 
INNER JOIN 
    SALES_REP sr ON ts.REP_ID = sr.REP_ID) 
Group By ts.Year-Month, ts.REP_Name; 

Von Ihrem letzten Kommentar, ich die zweite CTE geändert alle Beträge in bekommen gleicher Datumsbereich, der im SALES_RECEIPT CTE verwendet wird. Dies sollte Ihnen die richtige Summe von Verkäufen, Provisionen, Retouren und Provisionen über den gleichen Zeitraum geben, gruppiert nach bestimmten Verkäufern.

+0

OP erwähnt DBMS nicht, das, indem er seine/ihre sehr verwandten letzten 5 Fragen liest, MS Access ist, der Fensterfunktionen nicht unterstützt. – Parfait

+0

Ich erhalte den folgenden Fehler: "Ungültige SQL-Anweisung; erwartet 'DELETE', 'INSERT', 'PROCEDURE', SELECT 'oder' UPDATE '. Ich habe eine" Net Commission "-Spalte hinzugefügt, die" Gross Commission "-" Lost "Ich möchte, dass die Datumsspalte im Format Monat/Jahr ist (mit einer führenden Null für die Monate 1-9), aber gruppiert nach Jahr wie es jetzt ist. Danke für Ihre Hilfe. –

+0

Was ist Ihr dbms? Sie sollte in der Lage sein, den CTE-Code separat auszuführen, um zu debuggen, dass sie zurückgeben, was Sie erwarten. Wenn Sie ein wenig mehr Details bereitstellen können –

Verwandte Themen