Упражнение 28

Используя таблицу Product, определить количество производителей, выпускающих по одной модели.

В поддержку часто присылают такое решение от новичков:

SELECT COUNT(Maker) AS qnty
FROM Product
GROUP BY maker
HAVING COUNT(model)=1;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Помимо того, что это неверное решение задачи, новичка выдают функции COUNT(maker)/COUNT(model). COUNT(maker) - это вовсе не число производителей, а число строк в группе, для которых maker не равен NULL. COUNT(model) оказалось равным числу моделей, но не потому, что использован аргумент model, а потому, что каждая строка в таблице представляет собой модель, а model является ключом и не может быть NULL. Поскольку maker, согласно схеме, тоже не может быть NULL, то имеем

COUNT(maker) = COUNT(model) = COUNT(*) = COUNT(1) = ...

И все это число моделей в группе, а именно число моделей производителя, т.к. группировка выполняется по имени производителя (maker).

Итак, вот что делает данный запрос.

  1. Записи в таблице Product группируются по maker с подсчетом количества строк (моделей) для каждого производителя.
  2. Выполняется фильтрация групп, ограничивающая эти количества значением 1.

В результате получим:

1
1
1

И таких строк будет столько, сколько у нас имеется производителей, выпускающих по одной модели. Таким образом, рассматриваемый запрос отвечает следующему условию:

Для каждого производителя, выпускающего по одной модели, получить количество моделей. Вывод: количество моделей.

Согласитесь, что это совсем не то, что требовалось найти в упражнении 28. Хотя, чтобы решить задачу, осталось сделать совсем немногое, а именно, пересчитать эти строки. Это можно сделать, используя вышеприведенный запрос в качестве подзапроса (или CTE).

Если этой подсказки вам недостаточно для решения задачи, изучите следующий материал:

Получение итоговых значений.

Агрегатная функция от агрегатной функции.

Решить задачу на SQL-EX.RU