Sql 当左键连接两个表时,Sum似乎是两倍/三倍计数
我试图在一个标识号上连接两个表inventory和sales,并将库存中的货物数量、库存价值和销售价值/数量相加。这是按零件号分组的 以下是我正在做的: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
`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]相加。