2016-04-28 103 views
0

我有一個SALES RECEIPT表和一個RETURNS表。兩個表中的信息彼此獨立,但每個表都具有SALES_REP表中的Rep_ID屬性。訪問子查詢和聚合計算

在第一個子查詢中,我按月爲每個銷售人員計算SALES RECEIPT表中「總銷售額」和「總佣金」之和。

在第二個子查詢中,我按月爲每個銷售人員計算RETURNS表中的「退貨銷售」和「失業佣金」之和。

在主要查詢中,我想每個月向每個銷售人員顯示「總銷售額」, 「總佣金」,「退貨銷售額」,「佣金損失」和「淨佣金」。 「淨委員會」是「總委員會」減去「失業委員會」。

隨着我的代碼,我得到錯誤信息:「Microsoft Access數據庫引擎找不到輸入表或查詢‘totSales’確保它存在並且其名稱拼寫正確。」

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; 

下面的查詢返回月度銷售佣金數據,但只有一個銷售人員,我想上面的查詢返回完全相同的結果下面的查詢,但對所有銷售人員的不只是一個銷售人員。

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

您在Round(TotCommissions - TotLostCommissions,2)AS [Net Commission]後選擇的列是括號中的select語句,它返回多個字段。這在SQL中是不允許的。 您將此列命名爲'totSales',但在外部語句的FROM子句中,您將其引用爲表格 - 它不是。你想要什麼這個查詢返回? – Leviathan

+0

我發佈了查詢的代碼,該查詢僅返回一個銷售人員的月度佣金數據。我希望新查詢返回所有銷售人員的相同信息。 –

回答

1

移動這兩個子查詢,使它們位於查詢的FROM ... JOIN部分。正如@Leviathan指出的那樣,該查詢目前正在將它們視爲字段(當然,它們不是)。

另外:請確保您包含您在GROUP BY子句中分組的所有字段(並且不要別名 - 您將收到錯誤)。

這是對第一個查詢的刺戳。訪問是扭曲它是如何喜歡當你做多加入括號,所以道歉,如果它不工作的第一次:

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) 
; 

另外:作爲一種風格的東西:它一般最好把逗號分隔與外地它們後面的線,多個領域如:

SELECT 
    SomeField 
    ,SomeOtherField 

不是:

SELECT 
    SomeField, 
    SomeOtherField 

有些人得到真正彎出它的形狀,所以可能是一個很好想法試圖養成用逗號領先的習慣,以避免不必要的批評。

+0

最初的錯誤是:在查詢表達式'SUM(totReturns。[Return Sales],0')中與函數一起使用的參數數量錯誤我刪除了0,形式如下: Sum(totReturns。[Return Sales])AS [銷售退貨], Sum(totReturns。[Lost Commission])AS [Lost Commission], 現在它提示:輸入參數值爲(1)totReturns.Return Sales(2)TotCommissions(3)TotLostCommissions。任何值查詢返回所有列,但「銷售退貨」和「淨佣金」列爲空 –

+0

「總銷售額」,「總佣金」和「佣金損失」列的值遠遠高於應得值be。「月/年」和「銷售人員」列顯示正確的值。 –