使用 CTE 删除重复项时,有什么方法可以对重复行求和吗?
Is there any way to sum duplicate rows when deleting duplicates using CTE?
我有一个 table,其中包含重复的 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
功能?
问题说明:
您不能将 update
与 delete
语句一起使用,您需要在 update
之前使用 :
update t
set t.qty = (select sum(t1.qty) from table t1 where t1.itemid = t.itemid);
一个 CTE 只对一个语句有效,所以你需要 运行 cte 两次,一次求和然后删除,或者你可以把 CTE 的结果放在一个临时文件中 table然后使用temp table求和然后删除原来table.
中的记录
在第一级,您必须更新 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
我有一个 table,其中包含重复的 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
功能?
问题说明:
您不能将 update
与 delete
语句一起使用,您需要在 update
之前使用 :
update t
set t.qty = (select sum(t1.qty) from table t1 where t1.itemid = t.itemid);
一个 CTE 只对一个语句有效,所以你需要 运行 cte 两次,一次求和然后删除,或者你可以把 CTE 的结果放在一个临时文件中 table然后使用temp table求和然后删除原来table.
中的记录在第一级,您必须更新 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