Ответ 1
попробовать
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
У меня есть следующий запрос:
select carBrand, carYear, carModel from cars;
я хочу получить только разные названия автомобилей.
Я написал это, но это не то, что я хочу.
select DISTINCT carBrand, carYear, carModel from Cars;
Как я могу решить эту проблему?
попробовать
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
DISTINCT работает во всей строке, а не в определенном столбце. Если вы хотите получить уникальные имена, выберите только этот столбец.
SELECT DISTINCT carBrand FROM Cars
Это зависит от того, что вы хотите. Например, если вы хотите "Toyota Corolla" и "Toyota Camry", но игнорируете год, вы можете сделать это:
SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;
Я не уверен, почему принятый ответ был принят и, разумеется, не понял, почему он был поддержан, но у OP в вопросе есть следующее:
Я написал это, но это не то, что я хочу.
select DISTINCT carBrand, carYear, carModel from Cars;
Принятый ответ предложил использовать:
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
который возвращает тот же результат, что и запрос OP. На самом деле предложение в ответе (использование группы) даже не рекомендуется использовать для получения отличных результатов, но должно использоваться для агрегации. См. этот ответ для получения дополнительной информации.
Кроме того, SQL Server достаточно умен, чтобы понять, что если в запросе нет функции агрегации, запрос действительно запрашивает distinct
, поэтому он будет использовать distinct
под капотом.
В отличие от @MarkByers в его ответе, отличительная особенность будет отличаться от всей строки.
Для тех, кто хочет проверить выше, вот script, который создаст таблицу с тремя столбцами, а затем заполнит ее данными. Оба (distinct
и group by
) вернут тот же набор результатов.
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');
Оба запроса вернут этот результат:
carBrand carYear carModel
BMW 2000 328 i
BMW 2000 3M
Заключение
НЕ используйте group by
, если вам нужны разные записи. Используйте distinct
. Используйте group by
, когда вы используете функцию агрегата, такую как SUM
, COUNT
и т.д.