从 2 个单独的表中聚合计算

Posted

技术标签:

【中文标题】从 2 个单独的表中聚合计算【英文标题】:Aggregate calculations from 2 separate tables 【发布时间】:2016-08-16 19:16:43 【问题描述】:

我有一个SALES_RECEIPT 表和一个(销售)RETURNS 表,它们都将REP_ID 作为SALES_REP 表的外键。我想将每个销售代表的总销售额和总回报相加,并计算销售佣金和退货佣金损失。

查询运行没有错误,但列中的值不正确。这些值比实际值要大得多。我尝试了 INNER JOIN 和 LEFT JOIN 来链接 RETURNS 表,但这并没有解决问题。

 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;

【问题讨论】:

通过汇总某些销售的返回值来调试它:SELEcT Sum(Nz(returns.selling_price*returns.quantity)) AS [Returns Sales] FROM RETURNS WHERE REP_ID IN (put some sales IDs here) GROUP BY REP_ID 并检查返回的数字是否正确 以下代码具有正确的“退货销售”值,但如何在同一个查询中执行所有操作是困难的部分。 SELECT Format(returns.return_DATE,'yyyy-mm') AS [Year-Month], SALES_REP.rep_Name AS [Sales Person], Sum(Nz(returns. sell_price*returns.quantity)) AS [Returns Sales] FROM RETURNS INNER加入 SALES_REP ON RETURNS.REP_ID = SALES_REP.REP_ID WHERE RETURNS.RETURN_DATE 介于 #1/1/2000# 和 #12/31/2050# GROUP BY 格式(RETURNS.RETURN_DATE,'yyyy-mm'),SALES_REP.rep_Name; 对不起...不是访问大师...看起来您还需要在选择结束时使用分号。我上次编辑过它。让我知道它是如何工作的。 最新编辑的代码仍然会导致 Access 出现错误。看起来您在查询中有 2 个子查询来对 2 个表进行汇总。然后在查询的主要部分中选择子查询的结果。 Access 中子查询的语法必须与 SQL Server 的语法略有不同,这就是导致错误的原因。 【参考方案1】:

为 Access 编辑(尝试修复语法)

假设 RETURNS 表有一个到 SALES_RECEIPT 表的 Key ID ?

首先,根据 Date Range 拉取所有 SalesReceipt 记录 然后,根据相同的日期范围拉取所有 RETURNS

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;

根据您的上一条评论,我修改了第二个 CTE,以在 SALES_RECEIPT CTE 中使用的同一日期范围内获取所有 RETURNS。这应该为您提供按特定销售代表分组的同一日期范围内的销售额、佣金、退货和损失佣金的适当总和。

【讨论】:

OP 没有提到 DBMS,仔细阅读他/她非常相关的最后 5 个问题是 MS Access,它不支持窗口功能。 我收到以下错误:“无效的 SQL 语句;预期为 'DELETE'、'INSERT'、'PROCEDURE'、SELECT' 或 'UPDATE'。我添加了一个“净佣金”列“总佣金” - “损失佣金”。我希望日期列的格式为月/年(1-9 个月前导零),但像现在一样按年分组。谢谢你的帮助。 你的 dbms 是什么?您应该能够单独运行 CTE 代码以调试它们返回您期望的内容。如果你能提供更多细节。 我的 dbms 是我的 Windows 7 家用计算机上的 Microsoft Access 2010。 对不起......语法错误......我已经更新了第一行的答案。你能再试一次吗?希望这会有所帮助。

以上是关于从 2 个单独的表中聚合计算的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程(第2版)第3章 聚合与排序:3-1 对表进行聚合查询

[SQL] SQL 基础知识梳理- 聚合和排序

SQL.基础构建-第三节(3/4)

在两个单独的表中计算计划总额与实际总额

1.表的聚合查询(和平均最大最小值)

在一个查询 MYSQL 上从 2 个不同的表中计算 2 个不同的东西