Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-запрос, Помогите написать! 
:(
    Опции темы
Akina
Дата 18.10.2010, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(kvadrokub @  18.10.2010,  11:36 Найти цитируемый пост)
Zloxa не дружит с GROUP BY совершенно, а у Akina просто неправильные запросы

 smile Спасибо, поржал! 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kvadrokub
Дата 18.10.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Цитата(Zloxa @ 18.10.2010,  12:42)
Цитата(kvadrokub @  18.10.2010,  10:41 Найти цитируемый пост)
Я про этот запрос:

Иииииии?

http://www.sql-tutorial.ru/ru/book_group_by_clause.html
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  10:44 Найти цитируемый пост)
http://www

И все же... Иииииии?



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kvadrokub
Дата 18.10.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Цитата(Zloxa @ 18.10.2010,  12:45)
Цитата(kvadrokub @  18.10.2010,  10:44 Найти цитируемый пост)
http://www

И все же... Иииииии?

Ну создай таблицу, запусти и попробуй.
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  10:46 Найти цитируемый пост)
Ну создай таблицу, запусти и попробуй. 

Мне то это зачем? 
Я знаю где ошибся, но к сути вопроса это отношения не имеет.

Хотя да, ты прав. Я ступил. Надо было тебе посоветовать взять букрварь по SQL и почитать его.


Это сообщение отредактировал(а) Zloxa - 18.10.2010, 10:50


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kvadrokub
Дата 18.10.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Вот это твой запрос:
select command 
from table 
group by commmand 
having count(*)  = (select max(count(*)) 
                               from table 
                               group by command)

Буду разбирать по косточкам.
Возьму для начала вложенный подзапрос:
select max(count(*)) 
from table 
group by command

Во-первых, нельзя писать max(count(*)). Во-вторых, правильно будет выглядеть так:  
select command, count() или max() - одно из двух
from table 
group by command

, т.е. ошибка в написании GROUP BY. Его нельзя использовать так, как ты там писал.
Третяя ошибка вглавном запросе, там также в первой строке нужно использовать агрегатную функцию, иначе опять-таки GROUP BY выдаст ошибку.
Ну и в четвёртых, исходя из всех этих ошибок весь запрос неверен.
Проверял на MySQL, знаю по Oracle.
Ну и команда по-английски team, а не command, хотя это не важно, в принципе.

Я же говорю, создайте и попробуйте сами, если не верите мне.

Это сообщение отредактировал(а) kvadrokub - 18.10.2010, 10:58
PM MAIL   Вверх
Frees
Дата 18.10.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 2
Всего: 54



kvadrokub, а вопрос то у тебя какой, или ты возмущен что тебе дали не вылизанный запрос?
Ты сам думай как делать направление тебе дали, включи голову и не бухти..

Это сообщение отредактировал(а) Frees - 18.10.2010, 11:07


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Zloxa
Дата 18.10.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  10:56 Найти цитируемый пост)
Во-первых, нельзя писать max(count(*))

кто сказал?
Цитата(kvadrokub @  18.10.2010,  10:56 Найти цитируемый пост)
там также в первой строке нужно использовать агрегатную функцию

вовсе нет, группировка не обязывает к использованию аггрегатов
Цитата(kvadrokub @  18.10.2010,  10:56 Найти цитируемый пост)
Ну и команда по-английски team, а не command, хотя это не важно, в принципе

слово "команда" имеет несколько смылов в русском языке, в лишь одном из них, не самом употребмимом, на английский она переводится как team
Цитата(kvadrokub @  18.10.2010,  10:56 Найти цитируемый пост)
знаю по Oracle.

Цитата(kvadrokub @  18.10.2010,  10:56 Найти цитируемый пост)
попробуйте сами,

уболтал ;)
Код

Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 

SQL> with t  as (select 1 command from dual
  2              union all select 2 command from dual
  3              union all select 2 command from dual
  4              union all select 2 command from dual)
  5  select command from t group by command having count(*) = (select max(count(*)) from t group by command)
  6  ;
 
   COMMAND
----------
         2



Цитата(kvadrokub @  18.10.2010,  10:56 Найти цитируемый пост)
Ну и в четвёртых, исходя из всех этих ошибок весь запрос неверен.

молодец! Развеселил. Такой милый троллинг smile

Это сообщение отредактировал(а) Zloxa - 18.10.2010, 12:04


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kvadrokub
Дата 18.10.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



С тем, что не обязательно использовать агрегатную функцию с GROUP BY соглашусь, но вот MAX(COUNT(*)), по крайней мере в MySQL (Oracle недавно снёс и не могу проверить), нельзя писать: http://file.qip.ru/photo/_CxZwRKZ/sql.html
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  11:43 Найти цитируемый пост)
в MySQL нельзя писать

оберни в подзапрос
Код

select max(cnt) from (select count(*) cnt from table group by command) s



Это сообщение отредактировал(а) Zloxa - 18.10.2010, 12:01


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kvadrokub
Дата 18.10.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Уже. Спасибо за помощь, извини за нападки. smile
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  12:06 Найти цитируемый пост)
 Спасибо за помощь

И тебе спасибо, узнал что аггрегат от аггрегата - экзотика. MS,PG,Access так тоже не могут. В оракле эта фишка документирована. Может ктонить про FB сказать?



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Frees
Дата 18.10.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 2
Всего: 54



Цитата(Zloxa @  18.10.2010,  15:31 Найти цитируемый пост)
Может ктонить про FB сказать?

в FB 2.0 агрегат от агрегата - нельзя

Это сообщение отредактировал(а) Frees - 18.10.2010, 12:46


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Akina
Дата 18.10.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Zloxa, экотика - это агрегатная функция без group by. Вернее, либо group by присутствует, пусть и в неявной форме (поля группировки определяются перечнем полей в остальных частях запроса), либо на выходе должна получаться 1 запись вне зависимости от входного набора данных (и 0 записей - если входной набор пуст), но не больше.
А вот если идёт агрегатка от агрегатки... при наличии групбай перечень полей группировки явно никак не подходит либо к внутренней, либо к внешней агрегатке, а при отсутствии внешний групбай к набору из максимум одной записи бессмыслен.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 18.10.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  18.10.2010,  13:05 Найти цитируемый пост)
экотика - это агрегатная функция без group by.

ХМ. имхо это не экзотика, а вполне себе общепринятая практика.
без этого бы очень плохо жилось.

Цитата(Akina @  18.10.2010,  13:05 Найти цитируемый пост)
либо на выходе должна получаться 1 запись вне зависимости от входного набора данных (и 0 записей - если входной набор пуст), но не больше.

Есть такое правило, что при использовании аггрегата без группировки всегда возвращается одна и только одна строка. Именно по этому агрегацию без группировки нельзя представлять как аггрегацию с неявной группировкой по чему бы там ни было. Это обособленный случай. Аггрегация с группировкой, по пустому набору, вернет пустой набор. Аггрегация без группировки, по пустому набору, вернет одну запись.
Код

SQL> select nvl(max('hello'),'null') from dual where 1=2;

NVL(M
-----
null

SQL> select nvl(max('hello'),'null') from dual where 1=2 group by null;

no rows selected

MS и PG ведут себя так же

Цитата(Akina @  18.10.2010,  13:05 Найти цитируемый пост)
А вот если идёт агрегатка от агрегатки... при наличии групбай перечень полей группировки явно никак не подходит либо к внутренней, либо к внешней агрегатке, а при отсутствии внешний групбай к набору из максимум одной записи бессмыслен. 

При вложенной аггрегации, внутренний аггрегат всегда применяется к группам, а внешний - к результату внутреннего, подразумевая отсутствие группировки. Оракля не разрешает вложенные аггрегаты без груп бая. И той неоднозначности, о которой ты говоришь - нет.
Код

SQL>  select max(count(*)) from dual;
 select max(count(*)) from dual
            *
ERROR at line 1:
ORA-00978: nested group function without GROUP BY




Это сообщение отредактировал(а) Zloxa - 18.10.2010, 15:00


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1223 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.