Не содержится в предложении aggregate или group by

#sql #sql-server

#sql #sql-сервер

Вопрос:

Вот таблица:

Продукт (производитель, модель, тип)

Таблица «Продукт» содержит информацию о производителе, номере модели и типе («ПК», «Ноутбук» или «Принтер»)

Вызов:

Найдите производителей, которые производят только модели одного типа, и количество этих моделей превышает 1.

Что я сделал:

 SELECT maker, type
FROM Product
GROUP BY maker
HAVING COUNT (type) > 1 AND COUNT( DISTINCT type ) = 1
  

Проблема:

Столбец ‘Product.type’ недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Примечания:

В таблице создатель D создает только принтеры. Итак, я хочу получить:

 Maker | Type

D     | Printer
  

Если я удаляю type из запроса, я получаю D , что я и хочу, но без type . Если я включаю тип в предложение GROUP BY, я получаю другой результат.

Вопрос:

Как это исправить?

Комментарии:

1. Ваша строка ошибки — это не MySQL, а SQL Server. На самом деле, ваш запрос будет работать и выдавать правильные результаты в MySQL.

2. с удовольствием. Пожалуйста, обратите внимание, что этот сайт ориентирован на англоговорящих, фразы на иностранном языке могут сбить с толку не говорящих.

3. получил вас … к сведению)

Ответ №1:

 SELECT  maker, MIN(type)
FROM    product
GROUP BY
        maker
HAVING  COUNT(DISTINCT type) = 1
        AND COUNT(*) > 1
  

Комментарии:

1. Это работает) идеально) еще один вопрос, если вы не возражаете: почему следует использовать MIN? даже для типов varchar?

2. @Joe: потому что вам нужна агрегатная функция над выражением, которого нет GROUP BY . Вы можете использовать MAX , если вам это нравится больше.

Ответ №2:

Попробуйте,

 SELECT maker, type
FROM Product
GROUP BY maker,Type
HAVING COUNT (type) > 1 AND COUNT( DISTINCT type ) = 1