Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用联接和分组依据时sql总和值不正确_Sql - Fatal编程技术网

使用联接和分组依据时sql总和值不正确

使用联接和分组依据时sql总和值不正确,sql,Sql,我正在写一个查询,对按产品组分解的订单值进行求和-问题是,当我添加联接时,聚合的总和会大大膨胀-我假设是因为它添加了重复的行。我对SQL有点陌生,但我认为这是因为我需要用子选择或嵌套联接构造查询 所有数据都按预期返回,my Join会提取所需的数据,但返回的值总和(inv.item_total)远高于下面的-SQL SELECT so.Company_id, SUM(inv.item_total) AS Value, co.company_name, agents.short_desc, st

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

所有数据都按预期返回,my Join会提取所需的数据,但返回的值总和(inv.item_total)远高于下面的-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

关于如何构造此查询以提取“未重复”的总和(inv.item_total)的任何指导,我非常感谢。

听起来连接不准确

第一个可疑加入

例如,代理是根据
公司
,还是根据
发票

如果是按订单,那么连接应该是沿着

将代理作为代理加入agent.agent\u id=inv.agent\u id

第二个嫌疑犯加入

一个
订单
是否可以同时拥有多个
项目
,以及多个
发票
?这也会造成问题。假设一个订单有3个项目,并且发出了3张发票。根据您的联接,同一项目将显示3次,这意味着总共有9行项目,其中应该只有3行。您可能需要删除
发票

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

我将删除所有分组和总和,并查看是否可以按一个发票进行筛选,从而为所有数据生成一组唯一的行


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

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

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:许多关系?我刚刚注意到,在invoice和Agent之间,您有3个表正在联接。但是你从不使用它们做任何事情,是因为你为我们简化了事情,还是你可以删除这三个连接?嗨,当添加连接时会出现重复的总和:
join STOCK AS STOCK ON STOCK.STOCK\u id=soitem.STOCK\u id
。但是,问题是需要连接才能获得库存类型描述!我看不到一种连接但不会导致总和重复的方法?您需要更好地考虑结果表中每列的含义。存货总额在公司层面。但库存水平是多少?一家公司只有一只股票吗?如果没有,如何划分发票?每个销售订单都有多个销售订单项(描述、项代码等)来表示订单-它们存储在sorder_items表中-因此每个sorder_items行都通过sorder_id链接回来。但我需要从该表中获取项组。我不确定是否有可能在没有夸大金额的情况下退出——我的SQL技能还不太具备!