Sql 当左键连接两个表时,Sum似乎是两倍/三倍计数

Sql 当左键连接两个表时,Sum似乎是两倍/三倍计数,sql,sql-server,join,sum,left-join,Sql,Sql Server,Join,Sum,Left Join,我试图在一个标识号上连接两个表inventory和sales,并将库存中的货物数量、库存价值和销售价值/数量相加。这是按零件号分组的 以下是我正在做的: `select inv.[num] , sum(inv.[Value]) as [Inventory Value] , sum(inv.[qty]) as [Inventory Qty] , sum(sales.[Value]) as [Sales Value] , sum(sales.[qty]) as [Sales qty] from In

我试图在一个标识号上连接两个表inventory和sales,并将库存中的货物数量、库存价值和销售价值/数量相加。这是按零件号分组的

以下是我正在做的:

`select inv.[num]
, sum(inv.[Value]) as [Inventory Value]
, sum(inv.[qty]) as [Inventory Qty]
, sum(sales.[Value]) as [Sales Value]
, sum(sales.[qty]) as [Sales qty]
from Inv
left join sales
on inv.[num]=sales.[num]
group by inv.[num]`
库存价值总和大约是50倍,销售额大约是3到4倍。 如何避免过度求和?

使用group by和多对一或多对多的联接时,应首先聚合度量值并在维度上联接

select
    inv_agg.inv_num as 'Inventory Number'
    ,inv_agg.inv_value as 'Inventory Value'
    ,inv_agg.inv_qty as 'Inventory Qty'
    ,sales_agg.sales_value as 'Sales Value'
    ,sales_agg.sales_qty as 'Sales Qty'
from (select 
        inv.num as inv_num
        ,sum(inv.Value) as inv_value
        ,sum(inv.qty) as inv_qty
    from inv
    group by inv.num) inv_agg
left join (select
        sales.num sales_num
        ,sum(sales.Value) as sales_value
        ,sum(sales.qty) as sales_qty
    from sales
    group by sales.num) sales_agg
on inv_agg.inv_num = sales_agg.sales_num
或者,用CTE的

with inv_agg as (select 
        inv.num as inv_num
        ,sum(inv.Value) as inv_value
        ,sum(inv.qty) as inv_qty
    from inv
    group by inv.num),
sales_agg as (select
        sales.num sales_num
        ,sum(sales.Value) as sales_value
        ,sum(sales.qty) as sales_qty
    from sales
    group by sales.num)
select
    inv_agg.inv_num as 'Inventory Number'
    ,inv_agg.inv_value as 'Inventory Value'
    ,inv_agg.inv_qty as 'Inventory Qty'
    ,sales_agg.sales_value as 'Sales Value'
    ,sales_agg.sales_qty as 'Sales Qty'
from inv_agg left join sales_agg
    on inv_agg.inv_num = sales_agg.sales_num

正在发生的事情被称为扇风。你能给我们看一些样本数据,这样我们就可以确定哪种方法是最好的修复方法了吗?聚合Inv或单独聚合Sales都可以解决此问题。请尝试添加Sales.num不为null的位置。无论如何,上面的评论给了你正确的答案这是因为inv.[num]=sales.[num]不是一对一的匹配。Inv中的每一行都与sales中的多行配对,您将所有这些组合的[Value]相加。