Есть ли способ суммировать дубликаты строк при удалении дубликатов с помощью CTE? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть таблица, которая содержит дубликаты 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

. Фактическая проблема заключается в том, что я хочу Sum Qty и QtyPrice перед удалением повторяющихся записей.Куда мне добавить Sum функцию?

Иллюстрация проблемы:

enter image description here

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

CTE действителен только для одного оператора, поэтому вам нужно будет либо выполнить cte дважды, после суммирования, а затем удаления, или вы можете поместить результат CTE в временную таблицу, а затем использовать временную таблицу для суммирования, а затемудалить записи в исходной таблице.

0 голосов
/ 21 февраля 2019

На первом уровне вы должны обновить 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 
0 голосов
/ 21 февраля 2019

Вы не можете использовать update с оператором delete, вам нужно update до:

update t
     set t.qty = (select sum(t1.qty) from table t1 where t1.itemid = t.itemid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...