具有连接和父子级别的聚合问题 mssql

aggregation issue mssql with join and parent-child level

来源table例子

Table1
id      id_parent   product_id    
===     =========   ========    
154     104389        1043891       
155     104389        1995137331       

然后我还有另外两个库存 tables 如下:

(table2)
product_id   location_id       on_hand     transit
1043891          2           12      1
1043891          5           33      0
1043891          6           7       0
1043891          4           3       0
1995137331       2           8       5
1995137331       8           50      9
1995137331       5           95      0
1995137331       11          22      5
1995137331       13          93      1

(table3)
product_id   location_id    on_hand      transit
1043891           1         25       1
1995137331        1         29       0

我有以下查询:

; with 
O as (select Product_Id, SUM(OnHand) AS AllStore from Table2 group by Product_Id),
S as (select Product_Id, SUM(OnHand) as WH from Table3 group by Product_Id)

SELECT
   L1.id_parent as parent
  ,L1.product_id as child
  , O.AllStore
  , S.WH
FROM Table1 L0 JOIN Table1 L1 ON L0.id_parent = L1.id_parent 

LEFT OUTER JOIN S on S.Product_ID = L0.Product_Id
LEFT OUTER JOIN O on O.Product_ID = L0.Product_ID
group by L1.id_parent, L1.product_id, S.WH, O.AllStore

它有点用,但复制了记录。当前结果:

parent  child       AllStore    WH
1043892 1043891     104         102
1043892 1043891     242         123
1043892 1995137331  104         102
1043892 1995137331  242         123

预期结果:

parent  child       AllStore    WH
1043892 1043891     104         102
1043892 1995137331  242         123

有人可以看看它,看看我做错了什么,或者是否有更好的方法。

谢谢。

问题是由于您在

条件下将 Table1 加入自身
L0.id_parent = L1.id_parent 

此连接有效地采用 Table 1 和 2 行 104389,并将其与 2 行连接。此连接条件将产生 4 行。

SELECT
   *
FROM 
    @Table1 L0
    INNER JOIN @Table1 L1 ON
        L0.id_parent = L1.id_parent

id          id_parent   product_id  id          id_parent   product_id
----------- ----------- ----------- ----------- ----------- -----------
154         104389      1043891     154         104389      1043891
154         104389      1043891     155         104389      1995137331
155         104389      1995137331  154         104389      1043891
155         104389      1995137331  155         104389      1995137331

从你给出的例子来看,这个join是完全没有必要的,因为你需要的数据已经在L0

group by 语句也是不必要的,因为您不是 运行 任何聚合。保留它的最终结果与在整个查询中放置一个 DISTINCT 相同。

因此:生成所描述的 "Expected Results" 查询可以修改为下面

; with 
O as (select Product_Id, SUM(on_hand) AS AllStore from @Table2 group by Product_Id),
S as (select Product_Id, SUM(on_hand) as WH from @Table3 group by Product_Id)

SELECT
   L0.id_parent as parent
  ,L0.product_id as child
  ,O.AllStore
  ,S.WH
FROM
    @Table1 L0

    LEFT OUTER JOIN S ON
        S.Product_ID = L0.Product_Id

    LEFT OUTER JOIN O ON
        O.Product_ID = L0.Product_ID

注意:如果 L0 和 L1 连接是一个拼写错误,并且有第 4 个 table 正在播放但仍然产生重复,您可以将 L0 和 L1 连接提取到子查询中并将其区分。