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,请看我在这里的帖子,因为这里太长了。让我知道这是否有意义。