2016-04-28 8 views
0

Ich habe eine Tabelle Verkaufstabelle und eine Tabelle RETURNS. Die Informationen in den beiden Tabellen sind voneinander unabhängig, mit der Ausnahme, dass jede Tabelle das Attribut "Rep_ID" aus der Tabelle "SALES_REP" enthält.ACCESS Sub-Abfragen und Aggregatberechnungen

In der ersten Unterabfrage errechne ich die Summe der "Gesamtverkäufe" und der "Bruttokommission" aus der Tabelle "SALES RECEIPT" für jeden Verkäufer auf monatlicher Basis.

In der zweiten Unterabfrage berechne ich die Summe der "Return Sales" und der "Lost Commission" aus der RETURNS-Tabelle für jeden Vertriebsmitarbeiter auf einer monatlichen Basis.

In der Hauptabfrage, ich möchte für jeden Vertriebsmitarbeiter auf einer monatlichen Basis die "Gesamtumsatz", "Brutto Kommission", "Return Sales", "verlorene Kommission" und "Net Commission" anzuzeigen. Die "Net Commission" ist die "Gross Commission" abzüglich der "Lost Commission".

Mit dem Code, den ich habe, erhalte ich die Fehlermeldung: „. Die Datenbank Microsoft Access-Modul die Eingabetabelle oder Abfrage‚totSales‘nicht finden Stellen Sie sicher, es existiert und dass der Name richtig geschrieben ist.“

Select 
    totSales.Year-Month as [Month/Year], 
    SALES_REP.rep_name as [Sales Person], 
    SUM(totSales.[Total Sales]) as [Total Sales], 
    SUM(totSales.[Gross Commission]) as [Gross Commission], 
    SUM(totReturns.[Return Sales],0) as [Sales Returns], 
    SUM(totReturns.[Lost Commission],0) as [Lost Commission], 
    Round([Gross Commission] - [Lost Commission],2) AS [Net Commission], 


    (SELECT 
     Format(SALES_RECEIPT.sale_date,'yyyy-mm') AS [Year-Month], 
     SALES_RECEIPT.rep_id, 
     (SALES_RECEIPT.selling_price * SALES_RECEIPT.quantity) AS [Total Sales], 
     ((Nz(SALES_RECEIPT.selling_price, 0) * Nz(SALES_RECEIPT.quantity, 0)) * (Nz(SALES_RECEIPT.commission_percent, 100) * 0.001)) AS [Gross Commission] 
    FROM 
     SALES_RECEIPT 
    WHERE 
     SALES_RECEIPT.sale_date Between #1/1/2000# And #12/31/2050#) AS totSales, 


    (SELECT 
     RETURNS.rep_id, 
     (Nz(RETURNS.selling_price * RETURNS.quantity)) AS [Sales Returns], 
     ((Nz(RETURNS.selling_price, 0) * Nz(RETURNS.quantity, 0)) * (Nz(RETURNS.commission_percent, 100) * 0.001)) AS [Lost Commission] 
    FROM 
     RETURNS 
    WHERE 
     RETURNS.return_date Between #1/1/2000# And #12/31/2050#) As totReturns 

From (totSales 
    LEFT JOIN totReturns on totReturns.rep_id = totSales.rep_id) 
    INNER JOIN SALES_REP ON totSales.REP_ID = SALES_REP.rep_id 

Group By totSales.Year-Month, totSales.rep_name; 

die Abfrage unten liefert Daten monatliche Verkaufsprovision, sondern nur für einen Verkäufer. ich möchte die obige Abfrage exakt die gleichen Ergebnisse wie die Abfrage unten, sondern für alle Vertriebsmitarbeiter nicht nur ein Verkäufer zurück.

SELECT Format(DatePart("m",months.month_start),"00") & "/" & Year(months.month_start) AS [Month/Year], 

(SELECT SALES_REP.rep_name FROM SALES_REP WHERE SALES_REP.rep_id = 1) AS [Sales Person], 

(select Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2) 
FROM SALES_RECEIPT INNER JOIN SALES_REP ON SALES_REP.REP_ID = SALES_RECEIPT.REP_ID 
WHERE SALES_RECEIPT.[SALE_DATE] between months.month_start and months.month_end and SALES_REP.rep_id = 1) AS [Total Sales], 

(SELECT Round((Sum(((Nz(SALES_RECEIPT.SELLING_PRICE,0)*Nz(sales_receipt.quantity,0))*(Nz(sales_receipt.commission_percent,100)*0.001)))),2) 
FROM SALES_RECEIPT INNER JOIN SALES_REP ON SALES_REP.REP_ID = SALES_RECEIPT.REP_ID 
WHERE SALES_RECEIPT.[SALE_DATE] between months.month_start and months.month_end and SALES_REP.rep_id = 1) AS [Gross Commission], 

(SELECT Round(Nz(Sum(returns.selling_price * returns.quantity), 0),2) 
FROM (returns inner JOIN inventory ON INVENTORY.INVENTORY_ID = returns.INVENTORY_ID) 
LEFT JOIN SALES_REP ON SALES_REP.REP_ID = returns.REP_ID 
WHERE returns.return_date between months.month_start and months.month_end AND SALES_REP.rep_id = 1) AS [Sales Returns], 

(SELECT Round(Nz((Sum(((Nz(returns.SELLING_PRICE,0)*Nz(returns.quantity,0))*(Nz(returns.commission_percent,100)*0.001)))),0),2) 
FROM (returns inner JOIN inventory ON INVENTORY.INVENTORY_ID = returns.INVENTORY_ID) 
LEFT JOIN SALES_REP ON SALES_REP.REP_ID = returns.REP_ID 
WHERE returns.return_date between months.month_start and months.month_end AND SALES_REP.rep_id = 1) AS [Lost Commission], 

(SELECT Round((Sum(((Nz(SALES_RECEIPT.SELLING_PRICE,0)*Nz(sales_receipt.quantity,0))*(Nz(sales_receipt.commission_percent,100)*0.001)))),2) 
FROM SALES_RECEIPT INNER JOIN SALES_REP ON SALES_REP.REP_ID = SALES_RECEIPT.REP_ID WHERE SALES_RECEIPT.[SALE_DATE] between months.month_start and months.month_end and SALES_REP.rep_id = 1) - (SELECT Round(Nz((Sum(((Nz(returns.SELLING_PRICE,0)*Nz(returns.quantity,0))*(Nz(returns.commission_percent,100)*0.001)))),0),2) 
FROM(returns inner JOIN inventory ON INVENTORY.INVENTORY_ID = returns.INVENTORY_ID) 
LEFT JOIN SALES_REP ON SALES_REP.REP_ID = returns.REP_ID 
WHERE returns.return_date between months.month_start and months.month_end AND SALES_REP.rep_id = 1) AS [Net Commission] 

FROM 
(SELECT DateSerial(Year(sale_date), Month(sale_date), 1) AS month_start, 
DateAdd("d", -1, DateSerial(Year(sale_date), Month(sale_date) + 1, 1)) AS month_end 
FROM SALES_RECEIPT 
WHERE sale_date between #1/1/2000# And #12/31/2100# 

GROUP BY Year(sale_date), Month(sale_date)) AS months; 
+1

Die Spalte, die Sie nach 'Round (TotCommissions - TotLostCommissions, 2) AS [Net Commission] auswählen, ist eine Select-Anweisung in Klammern, die mehr als ein Feld zurückgibt. Dies ist in SQL nicht erlaubt. Sie haben diese Spalte 'totSales' benannt, aber in der FROM-Klausel der äußeren Anweisung verweisen Sie sie wie eine Tabelle - was nicht der Fall ist. Was genau soll diese Abfrage zurückgeben? – Leviathan

+0

Ich habe Code für eine Abfrage veröffentlicht, die monatliche Provisionsdaten für nur einen Vertriebsmitarbeiter zurückgibt. Ich möchte, dass die neue Abfrage die gleichen Informationen zurückgibt, aber für alle Vertriebsmitarbeiter. –

Antwort

1

Verschieben Sie die zwei Unterabfragen so, dass sie sich im Abschnitt FROM ... JOIN der Abfrage befinden. Wie @Leviathan bemerkt hat, behandelt die Abfrage sie derzeit so, als ob sie Felder wären (was sie natürlich nicht sind).

Außerdem: Stellen Sie sicher, dass Sie alle Felder, nach denen Sie gruppieren in der GROUP BY-Klausel (und nicht Alias ​​sie - Sie werden einen Fehler erhalten).

Hier ist ein Stich bei der ersten Abfrage. Der Zugang ist screwy mit, wie es mag Klammern, wenn Sie mehrere tun beitritt, so entschuldigen, wenn es nicht das erste Mal funktioniert:

Select 
    totSales.Year-Month as [Month/Year], 
    SALES_REP.rep_name as [Sales Person], 
    SUM(totSales.[Total Sales]) as [Total Sales], 
    SUM(totSales.[Gross Commission]) as [Gross Commission], 
    SUM(totReturns.[Return Sales],0) as [Sales Returns], 
    SUM(totReturns.[Lost Commission],0) as [Lost Commission], 
    Round(TotCommissions - TotLostCommissions,2) AS [Net Commission] 

FROM 
    SALES_REP 
INNER JOIN 
    (
    (SELECT 
     Format(SALES_RECEIPT.sale_date,'yyyy-mm') AS [Year-Month], 
     SALES_RECEIPT.rep_id, 
     (SALES_RECEIPT.selling_price * SALES_RECEIPT.quantity) AS [Total Sales], 
     ((Nz(SALES_RECEIPT.selling_price, 0) * Nz(SALES_RECEIPT.quantity, 0)) * (Nz(SALES_RECEIPT.commission_percent, 100) * 0.001)) AS [Gross Commission] 
    FROM 
     SALES_RECEIPT 
    WHERE 
     SALES_RECEIPT.sale_date Between #1/1/2000# And #12/31/2050#) AS totSales 
LEFT JOIN 
    (SELECT 
     RETURNS.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 
    WHERE 
     RETURNS.return_date Between #1/1/2000# And #12/31/2050#) As totReturns 
on totReturns.rep_id = totSales.rep_id 
) 
ON totSales.REP_ID = SALES_REP.rep_id 

Group By 
    totSales.Year-Month 
    ,SALES_REP.rep_name 
    ,Round(TotCommissions - TotLostCommissions,2) 
; 

auch: als Stil Sache: es ist in der Regel die Kommas setzt bevorzugt Trennung mehrere Felder auf der Linie mit dem Feld, das ihnen folgt, zB:

SELECT 
    SomeField 
    ,SomeOtherField 

nicht:

SELECT 
    SomeField, 
    SomeOtherField 

Einige Leute erhalten aus der Form über sie wirklich gebogen, so wahrscheinlich eine gute Idee zu versuchen und sich daran zu gewöhnen, mit dem Komma zu führen, um sich unnötige Kritik zu ersparen.

+0

Der anfängliche Fehler war: Falsche Anzahl der Argumente mit der Funktion im Abfrageausdruck 'SUM (totReturns. [Return Sales], 0'. Ich entfernte die, 0 aus den folgenden: Sum (totReturns. [Return Sales]) AS [ Umsatzrückgabe], Summe (totReturns. [Verlorene Kommission]) AS [Verlorene Kommission], Jetzt wird gefragt: Geben Sie den Parameterwert für (1) totReturns.Return Sales (2) TotCommissions (3) TotLostCommissions ein Die Spalten "Sales Returns" und "Net Commissions" sind leer. –

+0

Die Spalten "Gesamtumsatz", "Brutto-Provisionen" und "Provisionen verloren" haben Werte, die viel höher sind als sie eigentlich sein sollten Die Spalten "Monat/Jahr" und "Verkaufsperson" scheinen korrekte Werte zu haben. –