0

我正在编写一个查询,对按产品组细分的订单值进行求和 - 问题是当我添加连接时,聚合的 SUM 会大大膨胀 - 我认为这是因为它添加了重复的行。我对 SQL 有点陌生,但我认为这是因为我需要使用子选择或嵌套连接来构造查询?

所有数据都按预期返回,我的联接提取了所需的数据,但返回的 SUM(inv.item_total) AS 值远高于应有的值 - 下面的 SQL

SELECT  so.Company_id, SUM(inv.item_total) AS Value, co.company_name,
agents.short_desc, stock_type.short_desc AS Type


FROM SORDER as so

JOIN company AS co ON co.company_id = so.company_id
JOIN invoice AS inv ON inv.Sorder_id = so.Sorder_id
JOIN sorder_item AS soitem ON soitem.sorder_id = so.Sorder_id
JOIN STOCK AS stock ON stock.stock_id = soitem.stock_id
JOIN stock_type AS stock_type ON stock_type.stype_id = stock.stype_id
JOIN AGENTS AS AGENTS ON agents.agent_id = co.agent_id

WHERE
 co.last_ordered >'01-JAN-2012' and so.Sotype_id='1'


GROUP BY so.Company_id,co.company_name,agents.short_desc, stock_type.short_desc

任何关于我应该如何构造此查询以提取“不重复”的 SUM(inv.item_total) AS 值的指南都非常感谢。

4

2 回答 2

0

要获得准确的总和,您只需要所需的连接。所以,这个版本应该可以工作:

SELECT so.Company_id, SUM(inv.item_total) AS Value, co.company_name
FROM SORDER so JOIN
     company co
     ON co.company_id = so.company_id JOIN
     invoice inv
     ON inv.Sorder_id = so.Sorder_id
group by so.Company_id, co.company_name

然后,您可以一次添加一个连接,以查看乘法发生的位置。估计跟代理有关系。

于 2012-08-14T18:33:35.440 回答
-1

听起来连接不准确。

第一个嫌疑人加入

例如,代理是 percompany还是 per invoice

如果是按订单,那么连接是否应该类似于

JOIN AGENTS AS AGENTS ON agents.agent_id = inv.agent_id

第二个嫌疑人加入

一个人可以同时order拥有很多items和很多invoices吗?这也可能导致问题。假设一个订单有 3 件商品,并发出了 3 张发票。根据您的加入,相同的项目将显示 3 次意味着总共 9 个行项目应该只有 3 个。您可能需要消除该invoices

自行解决此问题的可能方法:

我会删除所有分组和总和,看看您是否可以按一张发票过滤,为所有数据生成一组唯一的行。

从只有一个项目的发票开始,然后检查结果集的准确性。如果可行,则添加另一张包含多个发票的发票并检查行,看看您是否获得了完美的数据集。如果没有,那么具有重复值的列(公司名称、项目名称、代理名称等)通常是检查重复出现的原因的良好起点。

于 2012-08-14T18:29:43.720 回答