2013-08-13 4 views
5

Ich versuche, eine Liste von eindeutigen Kunden aus einer Datenbank zu extrahieren, in der einige Kunden mehr als einmal aufgeführt sind. Die (fast) doppelten Zeilen existieren, weil Kunden von einer Abteilung in eine andere versetzt wurden oder weil die Kunden bei einer anderen Adresse (oder bei beiden) registriert wurden.So geben Sie eine Zeile aus der Gruppe durch mehrere Spalten zurück

So ist meine Herausforderung in Daten, die etwa wie folgt aussehen:

ID Customer Division Address 
----------------------------------- 
1 A   M   X 
1 A   L   X 
2 B   N   Y 
2 B   N   Z 
3 C   P   W 
3 C   T   S 

Ich mag meine select-Anweisung eine Zeile für jeden Kunden zurück (I dont care welche).

ID Customer Division Address 
----------------------------------- 
1 A   M   X 
2 B   N   Y 
3 C   P   W 

ich SQL Server bin mit 2008. Ich glaube, ich brauche eine „GROUP BY“ den letzten beiden Spalten zu tun, aber ich weiß nicht, wie man aus ihm nur eine Reihe zu bekommen.

Ich hoffe jemand kann mir helfen!

(Ja, ich weiß, das Problem sollte an der Quelle gelöst werden, aber das ist leider nicht in einem vernünftigen Zeitrahmen möglich ...).

Antwort

3
select ID, Customer,Division, Address from 
(
SELECT 
ID, Customer,Division, Address, 
ROW_NUMBER() OVER (PARTITON BY Customer Order by Id) as RN 
FROM T 
) t1 
WHERE RN=1 
+0

Das ist mein Problem gelöst. Vielen Dank, valex! Ich denke ich - fast - verstehe, wie es funktioniert. Das "t1" lässt mich wundern? Was macht das? Ist es nur eine Variable, um die Unterauswahl zu halten? –

+0

@Peter_DK T1 ist ein Alias ​​für die innere Unterabfrage. – valex

1

Versuchen Sie dieses -

DECLARE @temp TABLE 
(
     ID INT 
    , Customer CHAR(1) 
    , Division CHAR(1) 
    , [Address] CHAR(1) 
) 

INSERT INTO @temp (ID, Customer, Division, [Address]) 
VALUES 
    (1, 'A', 'M', 'X'), 
    (1, 'A', 'L', 'X'), 
    (2, 'B', 'N', 'Y'), 
    (2, 'B', 'N', 'Z'), 
    (3, 'C', 'P', 'W'), 
    (3, 'C', 'T', 'S') 

SELECT t.id 
    , t.Customer 
    , t.Division 
    , t.[Address] 
FROM 
(
    SELECT * 
     , rn = ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY 1/0) 
    FROM @temp 
) t 
WHERE T.rn = 1 

SELECT ID, Customer, Division = MAX(Division), [Address] = MAX([Address]) 
FROM @temp 
GROUP BY ID, Customer 

Ausgang -

id   Customer Division Address 
----------- -------- -------- ------- 
1   A  M  X 
2   B  N  Y 
3   C  P  W 

ID   Customer Division Address 
----------- -------- -------- ------- 
1   A  M  X 
2   B  N  Z 
3   C  T  W 
Verwandte Themen