如果第1列的值重复,如何在第1列末尾添加第2列的值

时间:2017-12-18 19:06:00

标签: sql-server tsql

我有一张如下所示的表格

[ID]  [  Company  ]   [ShippingCity]  [externalID]
 1      Microsoft       Bellevue         MM2547
 2      Microsoft       Bellevue         MM2548
 3      Microsoft       Seattle          MM2549
 4      Microsoft        Null            MM2550

我希望能够在一个select语句中使用该名称,并应用一个逻辑,该逻辑为我提供公司名称。 我正在使用这个逻辑:

SELECT CASE WHEN SHIPPINGCITY IS NULL THEN CONCAT(COMPANY,'-',EXTERNALID)
ELSE CONCAT(COMPANY,'-',SHIPPINGCITY) ELSE **THIS PART IS WHERE i AM LOST**
IF SHIPPING CITY IS SAME ADD THE EXTERNAL ID INTO SECOND RECORD

我知道我只能使用外部ID,但问题是我正在使用的客户端想要最后没有externalID的第一条记录,所以他们正在寻找如下所示的结果:

[ID]  [          Company           ]   [ShippingCity]  [externalID]
 1      Microsoft-Bellevue             Bellevue         MM2547
 2      Microsoft-Bellevue-MM2548      Bellevue         MM2548
 3      Microsoft-Seattle              Seattle          MM2549
 4      Microsoft-MM2550                 Null           MM2550

是否有任何逻辑可用于在单个SELECT语句中获取它?

提前多多感谢

2 个答案:

答案 0 :(得分:1)

您可以使用以下逻辑,该逻辑使用row_number根据公司和shippingcity对其进行分区。希望对你有意义。

DECLARE @t TABLE (ID INT, Company VARCHAR(255), ShippingCity VARCHAR(255), ExternalId VARCHAR(255))
INSERT INTO @t VALUES
(1,'Microsoft','Bellevue','MM2547'),
(2,'Microsoft','Bellevue','MM2548'),
(3,'Microsoft','Seattle','MM2549'),
(4,'Microsoft',Null,'MM2550')

SELECT  sub.ID, 
    CASE WHEN sub.ShippingCity IS NULL THEN sub.Company + '-' + sub.ExternalId
         WHEN sub.r = 1 THEN sub.Company + '-' + sub.ShippingCity
         WHEN sub.r > 1 THEN sub.Company + '-' + sub.ShippingCity + '-' + sub.ExternalId END AS Company
    , sub.ShippingCity, sub.ExternalId
FROM
    (   
    SELECT  Id, Company, ShippingCity, ExternalId, 
            ROW_NUMBER() OVER(PARTITION BY Company, ShippingCity ORDER BY Company, ShippingCity, ExternalId) AS r
    FROM    @t
    ) AS sub
ORDER BY ID

结果

ID  Company                     ShippingCity    ExternalId
----------------------------------------------------------
1   Microsoft-Bellevue          Bellevue        MM2547
2   Microsoft-Bellevue-MM2548   Bellevue        MM2548 
3   Microsoft-Seattle           Seattle         MM2549
4   Microsoft-MM2550            NULL            MM2550

答案 1 :(得分:1)

这应该可以解决问题: -

select
    id,
    case
        when ShippingCity is null then Company + '-' + ExternalID
        when row_number() over(partition by Company, ShippingCity order by ExternalID) = 1 then Company + '-' + ShippingCity
        else Company + '-' + ShippingCity + '-' + ExternalID
    end as [Company],
    ShippingCity,
    ExternalID
from [Your Table]
order by id