2012-04-08 6 views
10

Ho la seguente query:come utilizzare DISTINCT quando ho a più colonne in SQL Server

select carBrand, carYear, carModel from cars; 

quello che voglio è quello di ottenere i nomi di automobili solo diversi.

Ho scritto questo, ma non è quello che voglio.

select DISTINCT carBrand, carYear, carModel from Cars; 

come posso risolvere questo problema?

+1

nome auto è in quale campo? – Randy

+0

Nel mio SqlServer, "seleziona DISTINCT carBrand, carYear, carModel da Cars;" funziona perfettamente – Gamby

risposta

18

provare

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel; 
16

DISTINCT funziona sull'intera riga, non su una colonna specifica. Se si desidera ottenere i nomi univoci, selezionare solo quella colonna.

SELECT DISTINCT carBrand FROM Cars 
3

Dipende da quello che vuoi. Per esempio, se si vuole 'Toyota Corolla' e 'Toyota Camry', ma ignora l'anno, allora si potrebbe fare questo:

SELECT DISTINCT carBrand + ' ' + carModel AS carName 
FROM Cars; 
+0

Non provare a fare il pasticcio o essere un idiota, perché SQL non è quello con cui trascorro quasi tutto il tempo, ma ho sempre sentito che è semplicissimo ottenere SOLO DISTINCT su una singola colonna, tuttavia mi sono imbattuto in questo perché stavo ottenendo solo 20 record da "SELECT ID distinto da tablename" e ancora 1000 di record da "SELECT ID distinto, pid da tablename' –

+0

" SELECT ID distinto, pid dalla tabella '==' seleziona distinto (id, pid) dalla tabella 'quella parola chiave distinta funziona come combinazione di tutti i nomi delle colonne. ha parentesi segrete che avvolge tutte le colonne. potrebbe confondere le persone –

3

io non sono sicuro perché la risposta accettata è stata accettata e certamente non capisco perché è stato upvoted ma l'OP ha il seguente nella domanda:

Ho scritto questo, ma non è quello che voglio.

select DISTINCT carBrand, carYear, carModel from Cars; 

La risposta accettata ha suggerito di utilizzare:

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel; 

che restituisce lo stesso risultato esatto di query del PO. In realtà il suggerimento nella risposta (usa gruppo per) non è nemmeno incoraggiato per essere usato per ottenere risultati distinti, ma dovrebbe essere usato per l'aggregazione. Vedere la risposta this per maggiori informazioni.

Inoltre, SQL Server è abbastanza intelligente per capire che se non v'è alcuna funzione di aggregazione nella query, quindi la query è in realtà chiedendo distinct quindi userà distinct sotto il cofano.

Distinto farà un distinto sull'intera riga come @MarkByers ha indicato nella sua risposta.

Per coloro che desiderano testare quanto sopra, ecco uno script che creerà una tabella con 3 colonne e quindi la riempirà di dati. Entrambi (distinct e group by) restituiranno lo stesso set di risultati.

CREATE TABLE [dbo].[Cars](
    [carBrand] [varchar](50) NULL, 
    [carYear] [int] NULL, 
    [carModel] [varchar](50) NULL 
) 
go; 
insert into Cars values('BMW', 2000, '328 i'); 
insert into Cars values('BMW', 2000, '328 i'); 
insert into Cars values('BMW', 2000, '328 i'); 
insert into Cars values('BMW', 2000, '3M'); 

entrambe le query restituiranno questo risultato:

carBrand carYear carModel 
BMW   2000  328 i 
BMW   2000  3M 

Conclusione

NON usare group by se si desidera record distinti. Utilizzare distinct. Utilizzare group by quando si utilizza la funzione di aggregazione come SUM, COUNT ecc.