|
Программирование >> Руководство по sql
Ho это - не совсем то, что вам нужно. Здесь отображаются фуппы, минимальная цена по каждой фуппе и идентификационные номера книг, однако все это сделано в малопригодном для использования виде. В этих результатах невозможно найти идентификационные номера книг, которые имеют минимальную цену в каждой фуппе. Более полный запрос, отображающий как цену, так и минимальную цену, выводит вас на правильный путь: SQL: select type, min(price) from titles where type is not null group by type order by type Результат: ype business business business business mod cook mod cook popular comp popular comp popular comp psychology psychology psychology psychology as minprice, price, title id
psychology trad cook trad cook trad cook 7.00 11.95 11.95 11.99 7.99 20.95 11.95 14.99 PS7777 TC3218 TC4203 TC7777 Теперь должно быть ясно: если уж что-то вам действительно нужно, так это отобразить строку (или строки) в каждой фуппе, в которой значения цены и минимальной цены совпадают. В своем условии поиска вы должны использовать агрегирующую функцию. Предложение WHERE не позволяет сделать это, а HAVING - позволяет. Одним словом, похоже, что нам опять придется обратиться за помощью к предложению HAVING. Чтобы отобразить идентификационные номера для сфОк, содержащих минимальную цену по каждой фуппе, попытайтесь сделать следующее: SQL: select type, min(price) as minprice, price, title id from titles where type is not null group by type having price = min(price) order by type Результат: typ e business mod cook popular comp psychology trad cook minprice 2Г99 2.99 20.00 7.00 11.95 title id lu207~5 MC3021 PC8888 PS2106 TC4203 Теперь у вас есть список типов книг, минимальная цена по каждому типу и книги, имеющие такую цену. Однако не следует забывать, что этот запрос может не подходить для некоторых систем. Многие из них не допускают каких-либо иных значений в операторе SELECT, кроме столбцов из списка GROUP BY и афегируемых столбцов. Таким образом, может оказаться, что подобное использование столбца titleid является недопустимым. Те же результаты можно получить с помощью подзапроса: SQL: select type, price, title id from titles t where price = (select min(price) from titles t2 where t.type = t2.type group by t2.type) Результат: type business mod cook popularcomp psychology trad cook price 279 9~ 2.99 20.00 7.00 11.95 title id BU2075 MC3021 PC8888 PS2106 TC4203 Как избежать проблем с предложением HAVING Ниже приведено несколько соображений, которые помогут вам избежать проблем с использованием комбинаций предложений WHERE, GROUP BY и HAVING. В запросах без агрегирующих функций предложение WHERE накладывает ограничения на строки, которые появятся в окончательном результате: SQL: select pub id, type from titles group by pub id, type order by pub id, type Результат: pub id type 0736 business 0736 psychology 0877 NULL 0877 mod cook 0877 trad cook 1389 business 1389 popular comp SQL: select pub id, type from titles where pub id <> 0877 group by pub id, type order by pub id, type Результат: pub id type 0736 business 0736 psychology 1389 business 1389 popular comp В запросах с агрегирующими функциями предложение WHERE накладывает офаничения на строки, используемые при вычислении этих функций и создании фупп: SQL: select pub id, type, max(advance) from titles where pub id <> 0877 group by pub id, type order by pub id, type Результат: pub id type 0736 business 10125.00 0736 psychology 7000.00 1389 business 5000.00 1389 popular comp 8000.00
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |