从 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 个单独的表中聚合计算的主要内容,如果未能解决你的问题,请参考以下文章