|
Программирование >> Руководство по sql
Полученные результаты отображают восемь разных комбинаций цены и аванса. Две цены ($2.99 и $11.95) появляются дважды; одна авансовая сумма ($4000.00) также появляется дважды. DISTINCT с агрегирующими функциями А теперь посмотрим, как DISTINCT используется с афегирующими функциями. Многие новички- по части SQL задавались вопросом, как подсчитать различные значения в той или иной таблице, - и не находили на него ответа. Код, которым они, как правило, пытались воспользоваться, выглядит примерно так: SQL: select count(distinct *) from titles В результате на экране не появляется ничего, кроме синтаксических ощибок. В приведенном примере DISTINCT нельзя использовать в сочетании с функцией COUNT(*). Если над этим хорощенько подумать, то станет ясно, почему. Поскольку COUNT(*) подсчитывает все строки, нет возможности определить, от каких дубликатов вы пытаетесь избавиться. От копий конкретных значений столбцов? Каких именно? От копий дубликатных строк? По той же причине от DISTINCT вряд ли можно ожидать чего-то путного и в отнощении функций MIN или МАХ. Минимальное (или максимальное) значение для какого-либо столбца всегда является единственным. Ответ можно получить, выполнив следующие два щага: SQL: select distinct pub id into temp table from titles select count(*) from temp table Результат: 1 Однако есть более легкий способ. DISTINCT можно использовать для подсчета уникальных значений, когда вы указываете столбец по его имени. Вот пример кода, реализующего эту задачу: SQL: select count(distinct pub id) from titles SQL: select avg(distinct price) from titles where price < $15 Результат: 9.31 Если в вашей системе допускается использование нескольких ключевых слов DISTINCT с афегирующими функциями, можете попробовать следующий маневр: SQL: select avg(distinct price), avg(distinct advance) from titles where price < $15 Результат: 9.31 7200.00 Обратите внимание, что DISTINCT используется дважды - для каждой афеги-рующей функции. В противном случае вы, вероятно, получите весьма сомнительные результаты. DISTINCT и DISTINCT? в некоторых системах баз данных допускается сочетание двух видов DISTINCT - но будьте осторожны! Комбинирование имен столбцов и афегирующих функций может таить в себе немало подводных камней. Сочетание может запрещаться ващей системой, если по указанному столбцу не выполняется фуппировка. Но даже если это допускается, результаты, на первый взгляд, могут не иметь смысла. Рассмофим следующий пример: SQL: select distinct price, avg(distinct price) from titles where price < $15 Результат: price NULL 9.31 2.99 9.31 7.00 9.31 7.99 9.31 10.95 9.3t С другими афегирующими функциями DISTINCT используется точно так же. Чтобы найти среднеарифметическое значение цен, не превышающих $15.00, можно использовать следующий запрос:
То, что вы рассчитывали получить, т.е. среднеарифметическое значение разных цен ($9.31), вы и получаете в этом запросе. Но вы получили в распечатке так много цен? Очевидно, они не были ограничены условиями предложения WHERE. Как вы, наверное, помните, когда в списке выбора присутствуют афегирующие функции, на них распространяется действие предложения WHERE. Для управления запросом в целом необходимо добавить предложение HAVING: SQL: select distinct price, avg(distinct price) from titles where price < $15 having price < $15 Результат:
Теперь вы получили более осмысленные результаты: все уникальные цены ниже $15.00 и среднеарифметическое значение всех этих цен. Однако совмещение этих показателей выглядит не очень впечатляюще: такое отображение больще запутывает картину, чем проясняет ее. Возможно, имеет смысл не пользоваться несколькими DISTINCT в одном запросе, а разнести их по двум отдельным запросам. ДРУГИЕ НЕДОРАЗУМЕНИЯ Этот раздел относится к задачам, которые SQL должен бы выполнять - но не выполняет. Рассмофим следующие два примера. Оформление результатов в виде отчета. Нахождение первого значения. Удаление дубликатов Что поделаещь - SQL действительно не является инструментом форматирования! Есть кое-что, чего SQL просто не умеет делать, или умеет, но путем невероятных ухищрений. Иногда пользователю не остается ничего иного, как махнуть на SQL рукой и отправить свои результаты на какой-нибудь хороший генератор отчетов. Одним из таких случаев является удаление на выходе дублирующихся элементов.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |