2016-04-28 105 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。“月/年”和“销售人员”列显示正确的值。 –