#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