T-Sql查找重复的行值
我想写一个存储过程。T-Sql查找重复的行值
在那个存储过程中,我想从表中找到重复的行值,并计算这些行上的和操作到同一个表。
比方说,我有一个CustomerSales
表;
ID SalesRepresentative Customer Quantity
1 Michael CustA 55
2 Michael CustA 10
,我需要把表...
ID SalesRepresentative Customer Quantity
1 Michael CustA 65
2 Michael CustA 0
当我发现在同一时间SalesRepresentative
和Customer
重复,我想总结这些行的所有Quantity
值,并分配给一张桌子的第一排,其他人将是'0'。
你能帮助我吗?
聚集重复到一行:
SELECT min(ID) AS ID, SalesRepresentative, Customer
,sum(Quantity) AS Quantity
FROM CustomerSales
GROUP BY SalesRepresentative, Customer
ORDER BY min(ID)
或者,如果你真的想与0
那些额外行作为结果Quantity
:
SELECT ID, SalesRepresentative, Customer
,CASE
WHEN (count(*) OVER (PARTITION BY SalesRepresentative,Customer)) = 1
THEN Quantity
WHEN (row_number() OVER (PARTITION BY SalesRepresentative,Customer
ORDER BY ID)) = 1
THEN sum(Quantity) OVER (PARTITION BY SalesRepresentative,Customer)
ELSE 0
END AS Quantity
FROM CustomerSales
ORDER BY ID
这使得大量使用的window functions。
替代版本,而窗函数:
SELECT min(ID) AS ID, SalesRepresentative, Customer, sum(Quantity) AS Quantity
FROM CustomerSales
GROUP BY SalesRepresentative, Customer
UNION ALL
SELECT ID, SalesRepresentative, Customer, 0 AS Quantity
FROM CustomerSales c
GROUP BY SalesRepresentative, Customer
LEFT JOIN (
SELECT min(ID) AS ID
FROM CustomerSales
GROUP BY SalesRepresentative, Customer
) x ON (x.ID = c.ID)
WHERE x.ID IS NULL
ORDER BY ID
是的,类似这样的东西。
SELECT [SalesRep],[Customer] ,sum(Quantity)OVER(PARTITION BY [SalesRep],[Customer]) FROM CustomerSales
它可以工作,除了一件事情。它总计相同的行值,但不会在其他行中设置为'0'。 ORDER BY ID,[SalesRep],[Customer] –
Bertan
@BertanULUSOY:请考虑我的答案的更新版本。 –
是的,它绝对有效。第二个答案很棒...非常感谢Erwin。 OVER(PARTITION ...不是游标,不是吗?) – Bertan
如果您发布的代码,XML或数据样本,**请**突出显示文本编辑器的线,然后单击“代码示例”按钮('{ }')在编辑器工具栏上进行恰当的格式化和语法突出显示! –
另外:它是一个商店* D *过程 - 如在SQL Server中的** STORED ** - 它与一个*商店*无关...... –