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

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

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

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

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);
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

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

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