2014-02-27 151 views
2

我在列中有重复值的记录。如何使重复值唯一?

例如:

INVOICENUM PRODUCT 
------------------- 
    789789 ABROPT 
    789789 ABROPT 
    719648 AZGTEL 
    754114 GRTYPT 

我有2条记录与重复的发票号,将第一个数字我想补充“A”,第二我要添加“B”等等。

INVOICENUM PRODUCT 
------------------- 
789789a ABROPT 
789789b ABROPT 
719648  AZGTEL 
754114  GRTYPT 

我该如何解决这个问题 - 我正在使用SQL Server 2012和Microsoft SQL Server Management Studio 11.0.3000.0?

+4

您是否尝试过任何查询? – Fabio

+0

是否有第三个重复的可能性? – Kuzgun

+0

什么版本的sql? –

回答

1

玉以及假设的SQL Server(与ROWNUMBER功能),那么这似乎工作

select 
    INVOICENUM = case 
     when INVOICENUM in (select INVOICENUM from YourTable group by INVOICENUM having COUNT(*) > 1) 
     then INVOICENUM + char(96+row_number() over (partition by INVOICENUM order by INVOICENUM)) 
     else INVOICENUM 
    end, 
    PRODUCT, 
    OtherColumn, 
    AnotherColumn 
from 
    YourTable 

虽然它不是特别优雅...

这里的想法是让行号种子的int到字符功能CHAR(...)。其中96是a之前的字符的ASCII码,所以1的给出的数字给出a(即,ASCII码97),行号2给出b(即,ASCII码为98)等等。 。 我已经抛出的case语句在那里排除的情况时有没有重复,因此它只是给后面的InvoiceNum不添加信...

继承人我的测试例子...

declare @data table (INVOICENUM nvarchar(100), PRODUCT nvarchar(100)) 

insert into @data 
values ('789789', 'ABROPT') 
,('789789', 'ABROPT') 
,('719648', 'AZGTEL') 
,('754114', 'GRTYPT') 

select 
    INVOICENUM = case 
     when INVOICENUM in (select INVOICENUM from @data group by INVOICENUM having COUNT(*) > 1) 
     then INVOICENUM + char(96+row_number() over (partition by INVOICENUM order by INVOICENUM)) 
     else INVOICENUM 
    end, 
    PRODUCT 
from 
    @data 
+0

我的表格包含数千条记录和20多列,我刚刚提到了2列和4条记录:p – SamekaTV

+0

@jitsCode不确定你的观点是什么? '@ data'有助于测试你的情况下的问题,你会用你的表名替换@data,并且你会将你想要的列添加到select ... –

+0

我是否必须写下所有记录插入语句?或者有另一种方法来做到这一点。 – SamekaTV

2

通常这些问题通过解析函数

select case 
     when (count(1) over(partition by InvoiceNum) > 1) then 
      InvoiceNum + Char(row_Number() over(partition by InvoiceNum order by InvoiceNum) + 96) 
     else 
      InvoiceNum 
     end as InvoiceNum, 
     Product  
    from MyTable 

的分析函数的主要优点性能

+0

该操作在问题评论中确认* SQL Server 2012 *。 –

+0

我也更新了这个问题。 – SamekaTV

+0

这与我的回答非常相似(使用ascii代码来根据rownumber对种子进行种子处理) –

相关问题