loading..
Русский    English
05:31
листать

Упражнение 26

Найдите среднюю цену ПК и портативных компьютеров, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена

Решение 1.18.1

Консоль
Выполнить
  1. SELECT AVG(av.p) AS avg_price
  2. FROM (SELECT AVG(price) p
  3. FROM Product m, PC
  4. WHERE m.model = PC.model AND
  5. maker = 'A'
  6. UNION
  7. SELECT AVG(price) p
  8. FROM Product m, Laptop l
  9. WHERE m.model = l.model AND
  10. maker = 'A'
  11. ) AS av;

В подзапросе предложения FROM для производителя А объединяются средние цены на ПК и портативные компьютеры, после чего в основном запросе вычисляется среднее этих средних значений. Ошибка чисто арифметическая, которая заключается в том, что общее среднее значение (которое и нужно посчитать) не равно в общем случае среднему от средних значений.

Решение 1.18.2

Консоль
Выполнить
  1. SELECT ((SELECT SUM(price)
  2. FROM Product INNER JOIN
  3. PC ON Product.model = PC.model
  4. WHERE maker='A')
  5. +
  6. (SELECT SUM(price)
  7. FROM Product INNER JOIN
  8. Laptop ON Product.model = Laptop.model
  9. WHERE maker='A')
  10. ) / ((SELECT COUNT(price)
  11. FROM Product INNER JOIN
  12. PC ON Product.model = PC.model
  13. WHERE maker='A')
  14. +
  15. (SELECT COUNT(price)
  16. FROM Product INNER JOIN
  17. Laptop ON Product.model = Laptop.model
  18. WHERE maker='A')
  19. ) AS AVG_price;

Во втором решении сумма цен ПК и портативных компьютеров делится на их общее количество. С точки зрения математики все правильно. Но с точки зрения SQL — нет. Дело в том, что если в базе данных нет ПК (или портативных компьютеров), которые выпускал бы производитель А, то функция COUNT вернет значение 0 (что согласуется с математическими представлениями), а вот функция SUM вернет NULL-значение. В результате чего суммарная цена окажется равной NULL, а не суммарной цене имеющейся продукции другого типа, что хотелось бы получить.

ПиР

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

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