Sql server 具有联接和父子级的聚合问题mssql

Sql server 具有联接和父子级的聚合问题mssql,sql-server,join,aggregate,parent-child,Sql Server,Join,Aggregate,Parent Child,源表示例 Table1 id id_parent product_id === ========= ======== 154 104389 1043891 155 104389 1995137331 然后我有两个其他库存表,如下所示: (table2) product_id location_id on_hand transit 1043891

源表示例

Table1
id      id_parent   product_id    
===     =========   ========    
154     104389        1043891       
155     104389        1995137331       
然后我有两个其他库存表,如下所示:

(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
请有人看看,看看我做错了什么,或者有没有更好的方法


谢谢

这些问题是由于您将表1自身与

L0.id_parent = L1.id_parent 
这个连接有效地使用表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
从您给出的示例来看,这种连接是完全不必要的,因为您需要的数据已经在L0中了

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

因此:产生所述的“预期结果” 可以将查询修改为以下内容

; 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连接是一个输入错误,并且有第四个表在使用,但仍然产生重复项,则可以将L0和L1连接提取到子查询中并对其进行区分。

是否使用了
DISTINCT
?,而没有关于数据结构和预期结果的信息。这对我们所有人来说都只是猜测而已。DISTINCT不会更改结果集。您的查询不可能生成实际的重复项。也许您有一些带有空格的值,这会使它们看起来像重复的值。你能用复制问题的数据为样本表编写脚本吗?我猜不是。我认为问题在于亲子关系。即使我只提供一个孩子的id,也会带来所有的孩子。Lu,非常感谢您对解决方案的回复。当我解释我的问题时,它起了作用。我编写此报告的目的是从表中读取productID的列表,从表1中引入它的所有同级(包括它本身),并从表2和表3中获取它们的计数。只是不确定设计这个的最佳方法是什么。@很遗憾,Eclipse没有更多信息,我无法进一步提供帮助。我只能说,根据我的经验,如果您创建一个临时表,将所有带id的过滤基本数据放入其中,然后为aggregatesLu连接其他表,那么维护/调试有时会更容易,因此我有一个产品列表(id列表)。它们可以是子产品或父产品(并非所有产品都具有父/子层次结构)。我想列出所有儿童产品,并在我检查的列表中。列出他们所有的兄弟姐妹和他们的股票数量。Eclipse,你能详细说明你为他们列出兄弟姐妹和股票数量的意思吗。您是否希望父项下的所有产品总和为1?如果表1是子级和父级之间的映射,则表中的所有同级都将存在具有相同父级id的表。如果希望总和处于子级/同级级别,则无需涉及或重新涉及父级id。如果我建议的查询对实际数据无效,然后可能会给出一个更详细的样本数据和预期结果,以便我们更好地理解这个场景。Lu,请看我在这里的帖子,因为这里太长了。让我知道这是否有意义。