Характерные ошибки при решении задач на написание запросов на выборку (SELECT)База данных «Компьютерная фирма»Упражнение 28 |
||||||||
Используя таблицу Product, определить количество производителей, выпускающих по одной модели. В поддержку часто присылают такое решение от новичков:
Помимо того, что это неверное решение задачи, новичка выдают функции COUNT(maker)/COUNT(model). COUNT(maker) - это вовсе не число производителей, а число строк в группе, для которых maker не равен NULL. COUNT(model) оказалось равным числу моделей, но не потому, что использован аргумент model, а потому, что каждая строка в таблице представляет собой модель, а model является ключом и не может быть NULL. Поскольку maker, согласно схеме, тоже не может быть NULL, то имеем
И все это число моделей в группе, а именно число моделей производителя, т.к. группировка выполняется по имени производителя (maker). Итак, вот что делает данный запрос.
В результате получим:
И таких строк будет столько, сколько у нас имеется производителей, выпускающих по одной модели. Таким образом, рассматриваемый запрос отвечает следующему условию: Для каждого производителя, выпускающего по одной модели, получить количество моделей. Вывод: количество моделей. Согласитесь, что это совсем не то, что требовалось найти в упражнении 28. Хотя, чтобы решить задачу, осталось сделать совсем немногое, а именно, пересчитать эти строки. Это можно сделать, используя вышеприведенный запрос в качестве подзапроса (или CTE). Если этой подсказки вам недостаточно для решения задачи, изучите следующий материал: Агрегатная функция от агрегатной функции. |