Ошибки в задачах DML
В этой главе я разберу некоторые ошибки, которые допускаются в задачах DML. Номера задач, как и их формулировки, не приводятся, т.к. пока задачи DML не разделяются на учебные и рейтинговые, ввиду их малочисленности.
Ошибка состоит в использовании
SELECT MAX( cd ) FROM ...
Дело в том, что скорость CD-ROM хранится в текстовом представлении (например, ‘12x’). При сравнении текстовых констант ‘4x’ оказывается больше, чем ‘24x’. А если потребуется посчитать СРЕДНЮЮ скорость?!
Типичной ошибкой здесь является, например, такой прием:
round(avg(launched), 0)
Дело в том, что среднее значение приводится к типу аргумента. В данном случае оно приводится к целому числу, т.к. столбец launched имеет тип int. При этом SQL Server не округляет результат, а отбрасывает дробную часть. Это легко проверить, выполнив запрос:
SELECT AVG(launched) FROM (values(9),(10),(10)) X(launched);
[[ column ]] |
---|
[[ value ]] |
Математически 29/3 - это почти 10. Однако получаем 9. В результате функция ROUND здесь совершенно лишняя, т.к. округлять уже нечего.
Так как же здесь следует поступить? Очень просто. Нужно привести аргумент к вещественному типу, по нему считать среднее, а уже затем округлять.