【问题标题】:T-Sql find duplicate row valuesT-Sql 查找重复的行值
【发布时间】:2012-01-02 07:47:16
【问题描述】:

我想写一个存储过程。

在那个存储过程中,我想从一个表中找到重复的行值,并将这些行的求和运算计算到同一个表中。

假设我有一个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

当我同时发现SalesRepresentativeCustomer 重复时,我想将这些行的所有Quantity 值相加并分配给表格的第一行,其他的将为'0'。

你能帮帮我吗?

【问题讨论】:

  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!
  • 另外:它是一个 storeD 过程 - 如 SQL Server 中的 STORED - 它与 store 无关我> ...

标签: sql-server-2005 tsql stored-procedures


【解决方案1】:

要将重复项聚合到一行

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”。按 ID、[SalesRep]、[客户] 订购
  • @BertanULUSOY:请考虑我答案的更新版本。
  • 是的,它绝对有效。第二个答案很好......非常感谢欧文。 OVER(PARTITION... 不是光标,不是吗?
  • @BertanULUSOY:这是窗口函数的语法。我添加了指向我的答案的链接。
  • 再次感谢,这是我第一次使用并实现那个窗口功能。
猜你喜欢
  • 1970-01-01
  • 2018-06-29
  • 2015-06-23
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多