2012-04-08 25 views
10

Tengo la siguiente consulta:cómo utilizar DISTINCT cuando tengo múltiples columna en SQL Server

select carBrand, carYear, carModel from cars; 

lo que quiero es conseguir solamente diferentes nombres de coche.

Escribí esto, pero no es lo que quiero.

select DISTINCT carBrand, carYear, carModel from Cars; 

cómo puedo solucionar este problema?

+1

nombre del coche es en qué campo? – Randy

+0

En mi SqlServer, "seleccione DISTINCT carBrand, carYear, carModel from Cars;" Funciona perfectamente – Gamby

Respuesta

18

tratar

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

DISTINCT funciona en toda la fila, no en una columna específica. Si desea obtener los nombres únicos, seleccione solo esa columna.

SELECT DISTINCT carBrand FROM Cars 
3

Depende de lo que quiera. Por ejemplo, si desea 'Toyota Corolla' y 'Toyota Camry', pero ignora el año, entonces se podría hacer esto:

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

No trato de ser quisquilloso o ser un imbécil, ya que SQL no es con lo que paso casi tanto tiempo, pero ciertamente siempre sentí que es súper simple SOLAMENTE obtener 'DISTINCT' en una sola columna, sin embargo, me encontré con esto página ya que solo obtenía 20 registros de 'SELECT distinct id de tablename' y aún 1000 de registros de' SELECT distinct id, pid from tablename' –

+0

'SELECT identificación distinta, pid de tabla' == 'select distinct (id, pid) de la tabla 'esa palabra clave distinta funciona como combinación de todos los nombres de columna. tiene corchetes secretos que envuelve todas las columnas. puede confundir a las personas –

3

No estoy seguro de por qué la respuesta aceptada ha sido aceptada y desde luego no entiendo por qué ha sido votado pero el OP tiene lo siguiente en la pregunta:

Escribí esto, pero no es lo que quiero.

select DISTINCT carBrand, carYear, carModel from Cars; 

La respuesta aceptada ha sugerido el uso de:

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

que devuelve exactamente el mismo resultado que la consulta del OP. En realidad, la sugerencia en la respuesta (grupo de uso por) ni siquiera se anima a ser utilizada para obtener resultados distintos, sino que se debe usar para la agregación. Ver this respuesta para más información.

Además, SQL Server es lo suficientemente inteligente como para entender que si no hay una función de agregación en la consulta, entonces la consulta realmente está pidiendo distinct por lo que usará distinct debajo del capó.

Distinct hará una distinción en toda la fila como @MarkByers ha indicado en su respuesta.

Para aquellos que quieran probar lo anterior, aquí hay un script que creará una tabla con 3 columnas y luego la rellenará con datos. Ambos (distinct y group by) devolverán el mismo resultado.

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'); 

Ambas consultas volverán este resultado:

carBrand carYear carModel 
BMW   2000  328 i 
BMW   2000  3M 

Conclusión

NO use group by si quieres registros distintos. Use distinct. Use group by cuando usa la función de agregado como SUM, COUNT, etc.

Cuestiones relacionadas