2016-07-26 11 views
3

データを列から10文字に切り捨てる必要があります。しかし、私は重複を持つことはできませんので、最初の重複は〜1、2番目の重複は〜2で終了するようにしてください。ここで私が持っているものの例です:T-SQL重複を避けるために、テキストを切り捨て、末尾に数字を付けます。

Column 
------ 
The ABC Company Inc. 
The ABC Cooperative 
XYZ Associates LLC. 

私は結果がなりたい:

Column 
------ 
The ABC ~1 
The ABC ~2 
XYZ Associ 

最後は〜1か〜2である必要はありません、私はちょうど何かをする必要があります切り詰めた後にユニークにします。切り捨て後に3つ以上の重複が存在する可能性があります。

これまでのところ、私は手動でテーブルを切り捨てし、編集しています:

update Table set Column = Left(Column, 10) where len(Column) > 10 
+0

あなたは切り捨てる場合は、 "ABCカンパニー株式会社"と "ABC Cooperative"を10文字にすると、両方のために "The ABC Co"が残され、重複します。 – Peter

+1

ABC〜1は10文字です – AntDC

+2

重複が10個以上ある場合はどうなりますか? – datagod

答えて

4

最初の10、あなたは最初の8つの文字を気に、まずありませんが追加番号のスロットを予約する必要があるためです。

あなたが10回の未満の反復を持っていると仮定すると、あなたはこれを行うことができます。

with toupdate as (
     select t.*, 
      row_number() over (partition by left(col, 8) order by (select null)) as seqnum, 
      count(*) over (partition by left(col, 8)) as cnt 
     from t 
update toupdate 
    set col = (case when cnt = 1 then left(col, 10) 
        else left(col, 8) + '~' + cast(seqnum as char(1)); 

同じアイデアがselectのために使用することができます。

+1

ナンバリングが安定することは保証されておらず、行が追加または削除された場合、ナンバリングが変更されます。それは間違っていませんが、後でOPを驚かせるかもしれません。 – HABO

+0

これは私が必要なもののように見えます。私はクエリを修正しようとしていますが、最初の行 'toupdate as'で問題があります。私はこのコードに他の何かを追加するのに賛成ですか? 'toupdate'を更新したいテーブルに置き換えました。 SQL Management Studioには、 'to t'の近くに構文エラーがあり、その問題を修正する方法がわかっています。 – Peter

+1

@Peter。 。 。テーブルは 'from'と' t'の間の 'from'節に入ります。 –

4
Declare @Table Table (Column1 varchar(50)) 
Insert into @Table values 
('The ABC Company Inc.'), 
('The ABC Cooperative'), 
('XYZ Associates LLC.') 

Select NewColumn = Concat(substring(Column1,1,10),' ~',Row_Number() over (Partition By substring(Column1,1,10) Order by Column1)) 
From @Table 

戻り

NewColumn 
The ABC Co ~1 
The ABC Co ~2 
XYZ Associ ~1 
+0

Gordonが言及しているように、10は8になる可能性があります。 –

1

数字はノイズが多いので、必要なときに私はそれらを追加:あなたのテーブルを想定し

select case when _r > 1 
    then Company + '~' + cast(_r as varchar(5)) 
    else Company end as Company 
from (
    select Company 
     , ROW_NUMBER() over (partition by Company order by Company) as _r 
    from(
     select left(Company, 10) as Company 
     from MyTable 
    ) x 
) y 
order by Company 


Company 
-------------- 
The ABC Co 
The ABC Co~2 
XYZ Associ 
+0

私はこのソリューションが好きですが、これを使って既存のテーブルを更新するにはどうすればいいですか?このデータベースに新しいテーブルを追加することはできません。クエリの種類は役に立ちますが、その場でテーブルを更新する必要があります。 – Peter

0

はCOMPANYで、フィールドが仕入..... であるあなたがtweekする必要がありますが、それは役に立てば幸い..

SELECT SUBSTRING(Q.Comp, 1, 5) + '~' + CONVERT(nvarchar(4), Row) as NewFieldValue FROM 
(
SELECT ROW_NUMBER() OVER(PARTITION BY SUBSTRING(C.CompanyName, 1, 6) ORDER BY SUBSTRING(C.CompanyName, 1, 6)) AS Row, 
SUBSTRING(C.CompanyName, 1, 6) as Comp 
FROM COMPANY C 
)Q 
0
DECLARE @Table TABLE (Column1 varchar(50)) 

INSERT INTO @Table VALUES 
     ('The ABC Company Inc.') 
    , ('The ABC Cooperative') 
    , ('XYZ Associates LLC.') 
    , ('Acme') 
    , ('Ten Char 123') 
    , ('Ten Char 132') 
    , ('Ten Char 231') 


;WITH FLen 
    AS (
     SELECT Column1, LEFT(LEFT(Column1,13) + SPACE(13),13) + CHAR(164) AS Column2 
      FROM @Table 
     ) 

,TenCharPD -- Includes possible duplicates 
    AS (
     SELECT Column1, LEFT(Column2,8) + 
      RIGHT('0' + CAST (
      (ASCII(SUBSTRING(Column2, 9,1)) + 
      ASCII(SUBSTRING(Column2,10,1)) + 
      ASCII(SUBSTRING(Column2,11,1)) + 
      ASCII(SUBSTRING(Column2,12,1)) + 
      ASCII(SUBSTRING(Column2,13,1)))%100 
      AS NVARCHAR(2)),2) AS Column2 
     FROM Flen 
     ) 
,CullPD 
    AS (
     SELECT Column1, Column2, 
      ROW_NUMBER() OVER (PARTITION BY Column2 ORDER BY Column2) AS rowx 
     FROM TenCharPD 
     ) 

UPDATE t1 
    SET Column1 = LEFT(Column2,9) + 
    CASE rowx 
     WHEN 1 THEN RIGHT(Column2,1) 
     ELSE CHAR(rowx + CAST (RIGHT(Column2,1) AS INT) * 5 + 63) 
     END 
    FROM @Table t1 
     JOIN CullPD cpd 
      ON t1.Column1 = cpd.Column1 

SELECT * FROM @Table 
+0

このコードを使用して、既存のテーブルをオンザフライで更新する方法はありますか? – Peter

+0

As-Inでは、Column1の値をColumn2の値に置き換えますか? – DaveX

+0

はい。クエリを取得するのは良いですが、私も列を更新するために何かが必要です、ありがとう! – Peter

関連する問題