【问题标题】:Is there any way to sum duplicate rows when deleting duplicates using CTE?使用 CTE 删除重复项时,有什么方法可以对重复行求和?
【发布时间】:2019-07-15 07:33:27
【问题描述】:

我有一个包含重复的ItemId 的表。我正在使用CTE 删除重复记录,并为每个项目只保留一条记录。我可以使用以下查询成功实现这一里程碑:

Create procedure sp_SumSameItems
as
begin
    with cte as (select a.Id,a.ItemId,Qty, QtyPrice, 
    ROW_NUMBER() OVER(PARTITION by ItemId ORDER BY Id) AS rn from tblTest a)
    delete x from tblTest x Join cte On x.Id = cte.Id where cte.rn > 1
end

实际问题是我想在删除重复记录之前SumQtyQtyPrice。我应该在哪里添加Sum函数?

问题说明:

【问题讨论】:

    标签: sql-server duplicates aggregate-functions common-table-expression


    【解决方案1】:

    update不能与delete语句一起使用,你需要在update之前:

    update t
         set t.qty = (select sum(t1.qty) from table t1 where t1.itemid = t.itemid);
    

    【讨论】:

    • 这就是我要找的。干杯!!
    【解决方案2】:

    CTE 仅对一条语句有效,因此您需要运行 cte 两次,一次求和然后删除,或者您可以将 CTE 的结果放在临时表中,然后使用临时表求和,然后删除原表中的记录。

    【讨论】:

    • 对于您当前的解决方案,请先运行更新,如 Yogesh Sharma 的回答所示。
    【解决方案3】:

    在第一级,您必须在删除重复记录之后更新 Qty 和 QtyPrice。

    举个例子:

    CREATE PROCEDURE Sp_sumsameitems 
    AS 
      BEGIN 
          WITH cte1 
               AS (SELECT a.id, 
                          a.itemid, 
                          Sum(qty)     Qty, 
                          Sum(qtyprice)QtyPrice, 
                   FROM   tbltest a 
                   GROUP  BY a.id) 
          UPDATE x 
          SET    x.qty = c.qty, 
                 x.qtyprice = c.qtyprice 
          FROM   tbltest x 
                 JOIN cte1 c 
                   ON x.id = cte.id 
    
          WITH cte 
               AS (SELECT a.id, 
                          a.itemid, 
                          qty, 
                          qtyprice, 
                          Row_number() 
                            OVER( 
                              partition BY itemid 
                              ORDER BY id) AS rn 
                   FROM   tbltest a) 
          DELETE x 
          FROM   tbltest x 
                 JOIN cte 
                   ON x.id = cte.id 
          WHERE  cte.rn > 1 
      END 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 2021-07-16
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多