loading..
Русский    English
18:07
листать

Упражнение 28

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

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

Консоль
Выполнить
  1. SELECT COUNT(Maker) AS qnty
  2. FROM Product
  3. GROUP BY maker
  4. HAVING COUNT(model)=1;

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

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

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

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

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

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

1
1
1
...

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

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

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

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

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

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




Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
Варианты и особенности раскладки плитки
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.