![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с запросом [SQL92]
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 и строки обрабатывать вручную