loading..
Русский    English
20:08
листать

Ошибки в задачах DML

В этой главе я разберу некоторые ошибки, которые допускаются в задачах DML. Номера задач, как и их формулировки, не приводятся, т.к. пока задачи DML не разделяются на учебные и рейтинговые, ввиду их малочисленности.

Проблема. Требуется определить максимальную скорость имеющихся CD-ROM.

Ошибка состоит в использовании

  1. SELECT MAX( cd ) FROM ...

Дело в том, что скорость CD-ROM хранится в текстовом представлении (например, '12x'). При сравнении текстовых констант '4x' оказывается больше, чем '24x'. А если потребуется посчитать СРЕДНЮЮ скорость?!

Проблема. Требуется округлить среднее значение года спуска на воду кораблей.

Типичной ошибкой здесь является, например, такой прием:

  1. round(AVG(launched), 0)

Дело в том, что среднее значение приводится к типу аргумента. В данном случае оно приводится к целому числу, т.к. столбец launched имеет тип int. При этом SQL Server не округляет результат, а отбрасывает дробную часть. Это легко проверить, выполнив запрос:

 

Консоль
Выполнить
  1. SELECT AVG(launched) FROM (VALUES(9),(10),(10)) X(launched);

Математически 29/3 - это почти 10. Однако получаем 9. В результате функция ROUND здесь совершенно лишняя, т.к. округлять уже нечего.

Так как же здесь следует поступить? Очень просто. Нужно привести аргумент к вещественному типу, по нему считать среднее, а уже затем округлять.


Bookmark and Share
Тэги:
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 Больше тэгов
Учебник обновлялся
несколько дней назад
pedant-tver.ru
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100