【问题标题】:Sum seems to double/triple count when left joining two tables左加入两个表时,总和似乎加倍/三倍计数
【发布时间】:2014-07-22 16:35:52
【问题描述】:

我正在尝试在一个标识号上连接两个表(库存和销售额),并将库存中的商品数量、库存价值和销售价值/数量相加。这是按零件编号分组的。

这就是我正在做的事情:

`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 倍。 如何避免过度求和?

【问题讨论】:

  • 正在发生的事情被称为“扇形”。您能否向我们展示一些示例数据,以便我们确定哪种方法是修复它的最佳方法?单独汇总 Inv 或 Sales 应该可以解决这个问题。
  • 尝试添加where sales.num is not null。无论如何,上面的评论给了你正确的答案
  • 这是因为inv.[num]=sales.[num] 不是一对一的匹配。 Inv 中的每一行都与 sales 中的多行配对,您将所有这些组合中的 [Value] 相加。

标签: sql sql-server join sum left-join


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多