具有连接和父子级别的聚合问题 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 连接提取到子查询中并将其区分。
来源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 连接提取到子查询中并将其区分。