На главную страницу
Упражнения DML
Моисеенко С.И.
» Любое упражнение должно решаться одним запросом. Если, допустим, по условию
задачи требуется добавить в таблицу несколько строк, то вместо нескольких
запросов типа
INSERT ... VALUES...
следует использовать оператор INSERT с подзапросом.
» В одной из задач требуется определить максимальную скорость имеющихся CD-ROM.
Ошибка состоит в использовании
SELECT MAX( cd ) FROM ...
Дело в том, что скорость CD-ROM хранится в текстовом представлении (например,
'12x'). При сравнении текстовых констант '4x' оказывается больше, чем '24x'. А
если потребуется посчитать СРЕДНЮЮ скорость?!
» В одной из задач требуется округлить среднее значение года спуска на воду кораблей.
Типичной ошибкой здесь является, например, такой прием:
round(avg(launched), 0)
Как я уже писал в справке на сайте, среднее значение приводится к типу аргумента.
В данном случае оно приводится к целому числу, т.к. столбец launched имеет тип int. При этом
никакого округления не происходит, поскольку дробная часть просто ОТБРАСЫВАЕТСЯ.
Таковы особенности реализации в SQL Server. Причем это легко проверить (хотя мало
кто делает):
SELECT AVG(launched) FROM ( SELECT 9 AS launched UNION ALL SELECT 10 UNION ALL SELECT
10 ) x
Т.е. мы должны получить 29/3, т.е. почти 10. Однако получим мы 9. В результате функция
ROUND здесь уже совершенно лишняя, т.к. округлять нечего.
Так как же здесь следует поступить? Нужно привести аргумент к вещественному типу,
по нему считать среднее, а уже затем округлять.
На главную страницу