在重复值前生成数字

问题描述 投票:3回答:3

场景:我从导入SQL Server的平面文件中获取公司名称,地址,城市和联系人的数据。

我试图将这些数据导入一个只接受唯一公司名称的平台。让我们看一下平面数据的例子:

CompanyName  City          Address                           Contact
------------------------------------------------------------------------
Starbucks    Seattle       Null                              Pedram
Starbucks    Seattle       44 East Ave                       Daniel
Starbucks    Seattle       2701 Freedom way                  April
Starbucks    Seattle       3500 E Destination Drive          Steve
Starbucks    Luxembourg    N2915 Countrt Road AB             Hans
Starbucks    Orleans       2800 Rice St.                     Emily
Starbucks    St. Paul      6500 Henri-Bourassa BE            Casey
Starbucks    St. Paul      6500 Henri-Bourassa BE            Kathy

使用这样的数据集,我试图得到如下所示的结果:

 CompanyName                 City               Address                            
 -------------------------------------------------------------------------
 Starbucks (Seattle)         Seattle            Null                    
 Starbucks (Seattle-1)       Seattle            44 East Ave                       
 Starbucks (Seattle-2)       Seattle            2701 Freedom way                  
 Starbucks (Seattle-3)       Seattle            3500 E Destination Drive          
 Starbucks (Luxembourg)      Luxembourg         N2915 Countrt Road AB             
 Starbucks (Orleans)         Orleans            2800 Rice St.                     
 Starbucks (St. Paul)        St. Paul           6500 Henri-Bourassa BE 

我尝试过使用Row_numberPartition By,但我遇到的问题是:如何在前面生成这个数字?

下面是数据集的代码和我尝试过的内容:

Create table #Company 
(
     companyname nvarchar(255),
     City nvarchar(100),
     [Address] nvarchar(255),
     Contact nvarchar(255)
)

insert into  #Company (companyname, City, Contact) 
values ('Starbucks', 'Seattle', 'Pedram');

insert into  #Company (companyname, City, [Address], Contact) 
values ('Starbucks', 'Seattle', '44 East Ave', 'Daniel'),  
       ('Starbucks', 'Seattle', '2701 Freedom way', 'April'),
       ('Starbucks', 'Seattle','3500 E Destination Drive', 'Steve'),
       ('Starbucks', 'Luxembourg', 'N2915 Countrt Road AB', 'Hans'),
       ('Starbucks', 'Orleans', '2800 Rice St.', 'Emily'),
       ('Starbucks', 'St. Paul', '6500 Henri-Bourassa BE', 'Casey'),
       ('Starbucks', 'St. Paul', '6500 Henri-Bourassa BE', 'Kathy');

SELECT * FROM #Company

SELECT 
    ROW_NUMBER() OVER (PARTITINO BY companyname, city, [address] ORDER BY  companyname), 
    CASE 
       WHEN ROW_NUMBER() OVER (PARTITION BY companyname, city, [address] ORDER BY companyname, city, [address]) = 1 
          THEN companyname + ' ' + '(' + ISNULL(city,'')+ ')'
          ELSE companyname END,   --+ CAST(ROW_NUMBER() OVER (PARTITION BY T1.COMPANY, T1.CITY ORDER BY T1.[Address 1]) AS VARCHAR(3))
    *
FROM 
    #Company
sql-server sql-server-2014
3个回答
1
投票

使用一些cte来格式化并使用row_number():

--Number the rows
;with cte AS (
SELECT ROW_NUMBER() OVER(PARTITION BY companyname, city ORDER BY Address) AS counter_
, *
FROM #company 

--convert the number 1's to blanks and subtract each number by 1 so the 2nd record has a 1 appended
), cte2 AS (

SELECT *, 
CASE WHEN CAST(counter_ AS varchar(3)) = 1 THEN '' ELSE CAST(CAST(counter_ AS INT) - 1 AS VARCHAR(3)) END AS numberformatting 
FROM CTE
)
--if the formatted number is a blank, dont append anything. If it is non-blank, append a hyphen and the number
SELECT DISTINCT CASE WHEN numberformatting = '' THEN companyname + '(' + city + ')' ELSE companyname + '(' + city + '-' + numberformatting + ')' END AS formattedName, 
city, 
companyname, 
city, 
address
FROM cte2

2
投票

询问

SELECT 
        companyname 
       + ' (' + City 
       + REPLACE( ' - ' 
       + CAST( 
        ROW_NUMBER() OVER (PARTITION BY companyname , City 
                            ORDER BY CASE WHEN [Address] IS NULL 
                                            THEN '0' ELSE [Address] END
                            ) - 1 AS VARCHAR(10))
        + ')' , ' - 0', '') AS CompanyNameNew
        , City
        , [Address]

FROM #Company
ORDER BY CompanyName , [Address]

结果集

╔══════════════════════════╦════════════╦══════════════════════════╗
║      CompanyNameNew      ║    City    ║         Address          ║
╠══════════════════════════╬════════════╬══════════════════════════╣
║ Starbucks (Seattle)      ║ Seattle    ║ NULL                     ║
║ Starbucks (Seattle - 1)  ║ Seattle    ║ 2701 Freedom way         ║
║ Starbucks (Seattle - 2)  ║ Seattle    ║ 3500 E Destination Drive ║
║ Starbucks (Seattle - 3)  ║ Seattle    ║ 44 East Ave              ║
║ Starbucks (Orleans)      ║ Orleans    ║ 2800 Rice St.            ║
║ Starbucks (St. Paul)     ║ St. Paul   ║ 6500 Henri-Bourassa BE   ║
║ Starbucks (St. Paul - 1) ║ St. Paul   ║ 6500 Henri-Bourassa BE   ║
║ Starbucks (Luxembourg)   ║ Luxembourg ║ N2915 Countrt Road AB    ║
╚══════════════════════════╩════════════╩══════════════════════════╝

2
投票

我建议设置此顺序:

order by companyname,city,[address]

 ;WITH X AS
 (
     SELECT ROW_NUMBER() over (Partition by companyname,city,[address] order by companyname,city,[address]) rn,
     companyname,
     city,
     address,
     contact
     FROM #Company
 )
 SELECT CONCAT(companyname,' (', city, iif(rn=1, '', '-' + CAST(rn as varchar(10))), ')') CompanyName,
        City, Address, Contact
 FROM   X;
 GO


 CompanyName            | City       | Address                  | Contact
 :--------------------- | :--------- | :----------------------- | :------
 Starbucks (Luxembourg) | Luxembourg | N2915 Countrt Road AB    | Hans   
 Starbucks (Orleans)    | Orleans    | 2800 Rice St.            | Emily  
 Starbucks (Seattle)    | Seattle    | <em>null</em>                     | Pedram 
 Starbucks (Seattle)    | Seattle    | 2701 Freedom way         | April  
 Starbucks (Seattle)    | Seattle    | 3500 E Destination Drive | Steve  
 Starbucks (Seattle)    | Seattle    | 44 East Ave              | Daniel 
 Starbucks (St. Paul)   | St. Paul   | 6500 Henri-Bourassa BE   | Casey  
 Starbucks (St. Paul-2) | St. Paul   | 6500 Henri-Bourassa BE   | Kathy  

dbfiddle here

© www.soinside.com 2019 - 2024. All rights reserved.