2014-02-27 150 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對種子進行種子處理) –

相關問題