我正在编写一个查询,该查询对按产品组细分的订单值进行求和 - 问题是,当我添加连接时,聚合的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值非常感谢。
答案 0 :(得分: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
然后,您可以一次添加一个连接,以查看乘法发生的位置。我猜这与代理人有关。
答案 1 :(得分:-1)
听起来连接不准确。
首先怀疑加入
例如,代理商是按company
还是按invoice
?
如果是每个订单,那么连接是否应该是
JOIN AGENTS AS AGENTS ON agents.agent_id = inv.agent_id
第二次怀疑加入
一个order
可以同时拥有多个items
和多个invoices
吗?这也可能导致问题。假设一个订单有3个项目,并发出3个发票。根据您的联接,同一项目将显示3次意味着总共9个行项目应该只有3.您可能需要消除invoices
表
自行解决此问题的可能方法:
我会删除所有分组和总和,看看是否可以按一张发票过滤,为所有数据生成一组唯一的行。
从只有一个项目的发票开始,检查结果集的准确性。如果可行,则添加另一个具有多个发票并检查行的发票,以查看是否获得了完美的数据集。如果没有,那么具有重复值的列(公司名称,项目名称,代理名称等)通常是检查重复项显示原因的良好起点。