2017-12-18 12 views
0

ich eine Tabelle, wie untenWie 2 am Ende von 1 Spaltenwert der Spalte hinzufügen, wenn der Wert der Spalte 1 doppelte gewesen

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

Ich mag den Namen in einer select-Anweisung zu haben, um die Lage sein, und wenden Sie eine Logik an, die mir den Namen der Firmenbasis gibt. Ich bin mit dieser Logik:

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 

ich weiß, dass ich nur externe ID, aber Problem verwenden kann, ist Client arbeite ich mit will den ersten Datensatz ohne externalID am Ende, so dass sie für ein Ergebnis suchen, wie gezeigt unten:

[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 

Gibt es irgendeine Logik, die ich verwenden kann, um es in einer einzigen SELECT-Anweisung zu bekommen?

Vielen Dank im Voraus

Antwort

1

Diese den Trick tun sollten: -

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 
+0

Vielen Dank! einfach und effektiv. Ich schätze es sehr. –

1

Sie die folgende Logik verwenden könnte, die es auf Unternehmen und shippingcity basierend auf partitionieren Verwendung des row_number macht. Ich hoffe, es macht für dich Sinn.

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 

Ergebnis

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 
+0

Dank Kevin, ich habe es anwenden und es funktioniert. die Antwort, dass Mat auch funktioniert. @Mat Richardson Antwort basiert auf Zeilennummern und nicht in einer Unterabfrage, die es einfach macht, Code zu lesen. Ich schätze deine Hilfe sehr, du hast mir viel Zeit gespart. –

Verwandte Themen