Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с запросом [SQL92]


Страницы:   1 2

Romkin ©   (2003-04-29 10:40:00) 

Давно уже пишу хранимые процедуры, запросы простые, а тут наткнулся на задачу, и застрял:
Есть таблица вида (ClientID, OrderID) - думаю, понятно, клиенты и документы.
Вывести запросом ClientID - номер клиента(тов!), которые выписали максимальное количестводокументов.
Например:

ClientID OrderID
1 23
1 46
5 62
5 48
5 81
24 46
34 89
34 13

Должно выдать 5
О выдаче количества речь не идет, нужен номер.
Проблема в том, что сделать нужно одним запросом на основе стандарта. Напоминаю: select top ... нет (и не подходит)
select from select нет, select max(count) - вложенные агрегатные функции недопустимы.
Вопрос: Можно ли написать подобный запрос, один, без использования view?


Romkin   (2003-04-29 15:34:00) [1]

Нормально?! IB5.6 & FB1.5 - баг. Можно смеяться


Johnmen   (2003-04-29 15:26:00) [2]

Странно...Видимо, действительно, баг...:)
Проверил на WI-V6.2.908 Firebird 1.0 - нормально...


Romkin   (2003-04-29 15:18:00) [3]

Если бы, буквально, твой запрос, стоит вместо "> ALL" поставить "NOT IN" - bugcheck :-(


Johnmen   (2003-04-29 15:15:00) [4]

>Romkin © (29.04.03 15:03)
>IB рушится

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


Romkin   (2003-04-29 15:03:00) [5]

Кстати, могу сказать, что на мой запрос
Select ClientID, count(ClientID) as CntCli From Table
Group by ClientID
having count(ClientID) not in (Select count(ClientID)-1 from Table group by ClientID)
IB рушится:
internal gds software consistency check (EVL_expt: invalid operation (232))
А вот запрос Johnmen проходит, и дает правильный результат :-))


Romkin   (2003-04-29 14:59:00) [6]

Точно, спасибо :-))


Johnmen   (2003-04-29 14:44:00) [7]

>Romkin © (29.04.03 11:53)

Понятно, что такой запрос может давать некорректный результат...:)

Такой запрос однозначен :
SELECT T1.ClientID, COUNT(T1.ClientID)
FROM Table T1
GROUP BY T1.ClientID
HAVING COUNT(T1.ClientID) > ALL (SELECT COUNT(T2.ClientID)-1 FROM Table T2 GROUP BY T2.ClientID)


Соловьев   (2003-04-29 12:17:00) [8]

2 Romkin © (29.04.03 11:53)
супер-конечно, надо же сколько есть всяких способов.


Romkin   (2003-04-29 11:59:00) [9]

Только благодаря вам :-))
Не пофлеймишь - не поймешь :-)))


KoluChi   (2003-04-29 11:58:00) [10]

2Romkin © (29.04.03 11:53)
Ну ты мозг, оригинально, сам спросил - сам ответил.


Romkin   (2003-04-29 11:53:00) [11]

Yesss!!!
Select ClientID, count(ClientID) as CntCli From Table
Group by ClientID
having count(ClientID) not in (Select count(ClientID)-1 from Table group by ClientID)

Должно сработать!!! Или нет? Надо потестить


KoluChi   (2003-04-29 11:43:00) [12]

вместо = написать IN? Тогда вообще смысла нет.
остановимся на варианте Соловьев © (29.04.03 11:07)


Romkin   (2003-04-29 11:35:00) [13]

2KoluChi А вот так не пойдет, при = < > подзапрос должен вернуть строго 1 строку


KoluChi   (2003-04-29 11:31:00) [14]

Select ClientID, count(ClientID) as CntCli From Table
Group by ClientID
having count(ClientID) = (Select count(ClientID) from Table group by ClientID order by count(ClientID) desc)
и не надо избавиться от этого самого top :-))


Соловьев   (2003-04-29 11:31:00) [15]


> Почему извращаться, в любом случае нужно будет обрабатывать
> несколько строк с идентификаторами

я имею ввиду, проверку, когда несколько клиентов будут иметь максимальное количество.


stone   (2003-04-29 11:30:00) [16]

view:
select clientid, count(orderid) as ordercount from table group by clientid
, а потом запрос

select client id from table where clientid in (select clientid from view where ordercount = (select max(ordercount) from view))

если пооптимизировать, то конструкцию in можно заменить на конструкцию exists


KoluChi   (2003-04-29 11:29:00) [17]


> Соловьев © (29.04.03 11:14)
>
> > и строки обрабатывать вручную
>
> ну а че? если уж извращяться так по полной программе...
> :))))

Почему извращаться, в любом случае нужно будет обрабатывать несколько строк с идентификаторами. Если конечно не найдете способ идентификаторы разместить по колонкам (вот это будут извращение :)


Romkin   (2003-04-29 11:21:00) [18]

Select ClientID, count(ClientID) as CntCli From Table
Group by ClientID
having count(ClientID) = (Select top 1 count(ClientID) from Table group by ClientID order by count(ClientID) desc)
Теперь проблема - избавиться от этого самого top :-))


Соловьев   (2003-04-29 11:14:00) [19]


> и строки обрабатывать вручную

ну а че? если уж извращяться так по полной программе... :))))


KoluChi   (2003-04-29 11:08:00) [20]


> Romkin © (29.04.03 11:01)
> а если есть два ClientID с одинаковым максимальным количеством?

Тогда моя лог. цепочка разбилась в пух и прах :)
>Соловьев © (29.04.03 11:01)
только всесто sum взять count и строки обрабатывать вручную


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо