Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > HAVING MAX???


Автор: Killer_13 2.11.2011, 18:46
Я делаю запрос потом сне с запроса нужно найти максимальное значение.
Делаю вот так

Код
SELECT name,sum(strafen.betrag)
FROM strafen,spieler
WHERE spieler.spielernr=strafen.spielernr
GROUP BY name
HAVING max(strafen.betrag)>0

В строчке нужно обязательно что-то указывать. 
А если я не знаю какое у меня будет максимальное число? У меня несколько полей с числами - нужно найти максимальное
HAVING max(strafen.betrag)>0

Почему просто
HAVING max(strafen.betrag)
не срабатывает?
Спас.

Автор: Данкинг 2.11.2011, 19:06
А не проще сделать запрос с order by... по убыванию и взять top 1 ?

Автор: Killer_13 2.11.2011, 19:34
вариант, но хочется знать как сделать так как я спросил. Если знаете - подскажите пож.

Автор: Zloxa 3.11.2011, 09:05
Цитата(Killer_13 @  2.11.2011,  18:46 Найти цитируемый пост)
А если я не знаю какое у меня будет максимальное число? 

ничтно не мешает его узнать
Код

having max(strafen.betrag) = (select max(strafen.betrag) from strafen)



Цитата(Killer_13 @  2.11.2011,  18:46 Найти цитируемый пост)
Почему просто
HAVING max(strafen.betrag)
не срабатывает?

потому что такая синтаксическая конструкция не корректна

Автор: Killer_13 4.11.2011, 14:16
Пасиб.
Ваш стиль очень понятен.
в этом варианте я почему-то получаю 2 переменных, тоисть должно отобразиться одно поле с максом, а я получаю два, одно с максом, одно другое какое то.. Почему не подскажете?
Код


SELECT name,sum(strafen.betrag)
FROM strafen,spieler
WHERE spieler.spielernr=strafen.spielernr
GROUP BY name
HAVING max(strafen.betrag)= (select max(strafen.betrag) from strafen)



И еще вопрос, может кто знает где искать или у кого может есть *.chm или *.html справка по всем функциям насколько я читал последнего стандарта SQL 2003. А то я нахожу только мануалы к конкретным базам, мне сейчас не нужно не хочется изучать какую то базу, просто подучить чуток как запросы делаются и функции которые есть у всех базах. 

Автор: Zloxa 4.11.2011, 17:38
Цитата(Killer_13 @  4.11.2011,  14:16 Найти цитируемый пост)
 должно отобразиться одно поле с максом, а я получаю два, одно с максом, одно другое какое то.. Почему не подскажете?

А вы добавьте в список выводимых значений, еще и значение этого максимумума. Думаю, ответ станет и вам очевиден.  smile 

Автор: Killer_13 4.11.2011, 18:31
Думаю не станет, думал, думал и не надумал. Если можете - на пальцах объясните. Пасиб.

Автор: Zloxa 4.11.2011, 19:11
Цитата(Killer_13 @  4.11.2011,  18:31 Найти цитируемый пост)
Думаю не станет

Тогда и объяснения бесполезны. Объяснить нечто очевидное всегда сложнее чем просто пальцем показать.

Цитата(Killer_13 @  4.11.2011,  18:31 Найти цитируемый пост)
, думал, думал и не надумал

А я вам не подумать предлагал а посмотреть.

Сделайте так, чтобы запрос возвращал еще и значение максимума, тогда станет видно, что обе строки отобраны потому, что обе содержат одинаковое значение максимума. 

Автор: Killer_13 4.11.2011, 19:41
Цитата(Zloxa @  4.11.2011,  19:11 Найти цитируемый пост)
Сделайте так, чтобы запрос возвращал еще и значение максимума, тогда станет видно, что обе строки отобраны потому, что обе содержат одинаковое значение максимума. 

Стараюсь вникнуть в ваши слова. Нет, не одинаковые значения. Исходя из данного запроса у меня выведется 2 столбика в первом имя, во втором максимальное значение.

Постановка задачи такова.

Есть 2 таблички spieler и strafen 
Код
spieler
--------
spielernr PK
name


Код
strafen
--------
id
spielernr FK
betrag


вот как выгл табличка strafen

Код
spielernr   betrag
44            20
25            30
5             40
10            60
10            100
5             10
25            50
25            30


Нужно вывести имя у кого наибольшая сума sum(strafen.betrag)
В данном случае это имя номера 10

Автор: Zloxa 4.11.2011, 19:58
Цитата(Killer_13 @  4.11.2011,  19:41 Найти цитируемый пост)
Нужно вывести имя у кого наибольшая сума sum(strafen.betrag)

Это же уже совсем другая задача.

Код

SELECT name,sum(strafen.betrag)
FROM strafen,spieler
WHERE spieler.spielernr=strafen.spielernr
GROUP BY name
HAVING sum(strafen.betrag) = (select max(sum_betrag) from (select sum(strafen.betrag) sum_betrag from strafen group by spielernr ) s)


А позвольте поинтересоваться,  а чем вас не устроено решение, предложенное Данкингом?

Автор: Killer_13 4.11.2011, 20:39
Цитата(Zloxa @  4.11.2011,  19:58 Найти цитируемый пост)
А позвольте поинтересоваться,  а чем вас не устроено решение, предложенное Данкингом?


Честно признаться - не помню. Может потому что не слышал такого от препода. smile

Тем не менее , я оч много разобрался, и ваш стиль запроса я для себя запомнил. smile
И есть уже 2 варианта решения. smile
Вот так как он говорил.
Код

SELECT TOP 1 spieler.name,sum(strafen.betrag)
FROM strafen, spieler
WHERE spieler.spielernr=strafen.spielernr 
GROUP BY spieler.name
ORDER BY sum(strafen.betrag) DESC

Автор: Данкинг 4.11.2011, 20:41
Цитата(Killer_13 @  4.11.2011,  21:39 Найти цитируемый пост)
Честно признаться - не помню. Может потому что не слышал такого от препода. 

Не помнишь чего?  smile 

Автор: Killer_13 4.11.2011, 20:42
Люди говорили что на SyBase TOP не работает, оказывается - работает.

Добавлено через 3 минуты и 2 секунды
Цитата(Данкинг @  4.11.2011,  20:41 Найти цитируемый пост)
Не помнишь чего?  smile  


 smile  - не помню чем не устроило, я уже тут целый день напролом с sql рублюсь - вижу свет в конце туннеля. smile

Пасиб. smile

Автор: Zloxa 4.11.2011, 20:46
Цитата(Killer_13 @  4.11.2011,  20:39 Найти цитируемый пост)
2 варианта решения. 

Надо понимать, что эти запросы не эквивалентны. 
А вот если к top добавить WITH TIES... они станут давать эквивалентный результат, и подзапрос с TOP, на современном этапе развития оптимизаторов, будет производительнее, но он опирается на особенности платформы и не соответствует стандартам sql

Автор: Killer_13 4.11.2011, 20:52
Цитата(Zloxa @  4.11.2011,  20:46 Найти цитируемый пост)
 и подзапрос с TOP, на современном этапе развития оптимизаторов, будет производительнее, но он опирается на особенности платформы и не соответствует стандартам sql

может потому и не хотел. smile


Цитата(Zloxa @  4.11.2011,  20:46 Найти цитируемый пост)
А вот если к top добавить WITH TIES...

иду читать что это

Цитата(Zloxa @  4.11.2011,  20:46 Найти цитируемый пост)
Надо понимать, что эти запросы не эквивалентны. 

для начинающего сойдет, спасиб за предостережение.

Автор: Killer_13 4.11.2011, 21:46
Цитата(Zloxa @  4.11.2011,  19:58 Найти цитируемый пост)
HAVING sum(strafen.betrag) = (select max(sum_betrag) from (select sum(strafen.betrag) sum_betrag from strafen group by spielernr ) s)


разбирал вашу строчку, насколько я читал и понимаю, то после запроса можно ставить новое имя таблицы например AS <имя> или без AS, почему у меня запрос ложится когда я хочу убрать "s" в конце? Мы ж ее нигде не используем... можно же без нее обойтись...

Автор: Самозванка 4.11.2011, 23:33
All subqueries in the FROM clause must be aliased to something, anything, otherwise you'll get an error. 

Автор: Данкинг 4.11.2011, 23:35
Самозванка, наверное, подобное СУБД-зависимо всё же. На фоксе подзапросы и без алиасов отлично работают.

Автор: Самозванка 4.11.2011, 23:57
Цитата(Killer_13 @  4.11.2011,  20:42 Найти цитируемый пост)
SyBase 


Автор: Killer_13 5.11.2011, 00:04
Внятное объяснение, понятно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)