2013-08-13 12 views
5

Sto cercando di estrarre un elenco di clienti unici da un database in cui alcuni clienti sono elencati più di una volta. Le (quasi) righe duplicate esistono perché i clienti sono stati spostati da una divisione all'altra o perché i clienti sono stati registrati con un altro indirizzo (o entrambi).Come restituire una riga dal gruppo di più colonne

Quindi la mia sfida è nei dati che sembra qualcosa di simile:

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 

voglio che il mio select per tornare una riga per ogni cliente (mi preoccupo quale).

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

Sto usando SQL Server 2008. Penso che ho bisogno di fare un "gruppo da" le ultime due colonne, ma non so come ottenere solo una riga fuori di esso.

Spero che qualcuno possa aiutarmi!

(Sì, so che il problema dovrebbe essere risolto alla fonte ma sfortunatamente non è possibile entro un ragionevole periodo di tempo ...).

risposta

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

Questo risolto il mio problema. Grazie mille, valex! Penso di capire quasi come funziona. Il "t1" mi fa meravigliare? Cosa fa? È solo una variabile per contenere la selezione secondaria o? –

+0

@Peter_DK T1 è un alias per la sottoquery interna. – valex

1

provare questo -

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 

uscita -

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 
Problemi correlati