Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
Привет всем.

Очень требуется ваша помощь.

Есть клиенты, у которых есть опредленная сумма денег, у каждого клиента есть свой консультант (консультант имеет свой уникальный код).
Мне нужно выбрать 10 клиентов каждого консультанта, с самими большими сумами.

Может у кого то есть идеи как ето можно реализовать. Буду очень благодарна.
22 окт 09, 14:44    [7824440]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А сервер какой?
А если больше 10 клиентов имеют максимальную сумму, с остальными что делать?
22 окт 09, 14:47    [7824473]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
http://www.itcommunity.ru/blogs/mssql/archive/2007/12/23/3856.aspx
22 окт 09, 14:49    [7824485]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
сервер 2000.

А остальные не интересуют. Главное у каждого консультанта найти 10 лучших?
22 окт 09, 14:51    [7824516]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
bojeviciok,

если 2005 и выше -
select * from
(
	select idManager, idClient, sum(s) s, 
		row_number() over(partition by idManager order by sum(s) desc) N
	from T
	group by idManager, idClient
) t
where N <= 10

22 окт 09, 14:58    [7824567]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
bojeviciok
сервер 2000.

А остальные не интересуют. Главное у каждого консультанта найти 10 лучших?
Тогда покажите скрипт создания таблицы (CREATE TABLE).

А что будет с 11-м клиентом, у которого результат такой же, как и у 10-го?
На каком основании Вы его игнорируете? Почему 10-й - "лучший", а 11-й - не "лучший" в таком случае?
22 окт 09, 15:20    [7824740]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
iap
bojeviciok
сервер 2000.

А остальные не интересуют. Главное у каждого консультанта найти 10 лучших?
Тогда покажите скрипт создания таблицы (CREATE TABLE).

А что будет с 11-м клиентом, у которого результат такой же, как и у 10-го?
На каком основании Вы его игнорируете? Почему 10-й - "лучший", а 11-й - не "лучший" в таком случае?


Ну если сумма такая же, то конечно надо оставить :) Ето я сглупила так ответив.
На счет скрипта, то для того, чтобы показать его мне надо переиминовать названия столбцов, а то они на литовском языке :)
22 окт 09, 15:36    [7824858]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
iap
...На каком основании Вы его игнорируете? Почему 10-й - "лучший", а 11-й - не "лучший" в таком случае?

Абсолютно верное замечание.
22 окт 09, 15:39    [7824889]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
bojeviciok
iap
bojeviciok
сервер 2000.

А остальные не интересуют. Главное у каждого консультанта найти 10 лучших?
Тогда покажите скрипт создания таблицы (CREATE TABLE).

А что будет с 11-м клиентом, у которого результат такой же, как и у 10-го?
На каком основании Вы его игнорируете? Почему 10-й - "лучший", а 11-й - не "лучший" в таком случае?


Ну если сумма такая же, то конечно надо оставить :) Ето я сглупила так ответив.
На счет скрипта, то для того, чтобы показать его мне надо переиминовать названия столбцов, а то они на литовском языке :)
Тогда Knyazev Alexey Вам правильный путь показал
1ый вариант - Ваш. Только TOP 1 на TOP 10 заменИте.
22 окт 09, 15:44    [7824929]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
А может вам сделать градацию клиентов.
Например:
до 10 000$ - средний Клиент
от 10 001$ до 50 000$ - уважаемый Клиент
от 50 001$ до 100 000$ - топ Клиент
от 100 001% - ВИП Клиент
22 окт 09, 15:55    [7825014]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
Тогда не надо привязываться к количеству клиентов, а тока к группе. Например выбрать для данного консультанта всех ВИП клиентов.
22 окт 09, 15:58    [7825038]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
DVN
Тогда не надо привязываться к количеству клиентов, а тока к группе. Например выбрать для данного консультанта всех ВИП клиентов.


Так сделать не получиться, потому что у некоторых консультантов например только 8 клиентов, они все нужны, а суммы у них могут быть сравнивая с другими очень маленькие. Так что по сумме так расортировать не удасться.
22 окт 09, 16:08    [7825141]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
caper
Member

Откуда: Москва
Сообщений: 418
bojeviciok, прибл. так
declare @t table (idclient int,idmanager int, summa decimal(20,4))

insert into @t (idclient,idmanager,summa)
select 1,1,100 union all
select 2,1,200 union all
select 3,1,400 union all
select 4,1,300 union all

select 5,2,500 union all
select 6,2,200 union all
select 7,2,500 union all
select 8,2,300 union all

select 9,3,100 union all
select 10,3,200 


--2005
select t.* from @t t
inner join
(
	select  idmanager,summa , row_number()over (partition by idmanager order by summa desc ) RN  from (select distinct idmanager,summa from @t ) t
) P
on P.RN=2 and t.summa>=P.summa and t.idmanager=P.idmanager

--2000
select t.* from @t t
where t.summa in
(
	select  top 2 summa from (select distinct idmanager,summa from @t ) t2 where t2.idmanager=t.idmanager order by t2.summa desc
)

22 окт 09, 17:09    [7825650]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
Caper спасибо за помощь :) Вот только одна проблема, строчек много и если выберать из всего списка, то Timeout expired. Как можно ето обойти?
2 ноя 09, 14:40    [7871314]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
bojeviciok
Caper спасибо за помощь :) Вот только одна проблема, строчек много и если выберать из всего списка, то Timeout expired. Как можно ето обойти?


Увеличить время выполнение команды клиентского приложения? Или оптимизировать запрос?…

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
2 ноя 09, 14:44    [7871349]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
Извините может быть за глупый вопрос, но где ето время изменить? :)
2 ноя 09, 14:45    [7871359]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
bojeviciok
Извините может быть за глупый вопрос, но где ето время изменить? :)


В вашем клиентском приложение, конечно же…

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
2 ноя 09, 14:48    [7871380]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Вот пример на C#...

SqlConnection oConn = new SqlConnection(“Строка подключения”);
            SqlCommand oComm = new SqlCommand(“Текст запроса”);            
            //Ждать результат вечно или пока не настанет КС…
            oComm.CommandTimeout = 0;
            oComm.Connection = oConn;

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
2 ноя 09, 14:53    [7871423]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
Запускаю через QA, проходит много времени и никакого результата.
Через ЕМ- timeout expired. Query timeout = 0 , не помогает.

оптимизация запроса, может и хорошая идея, только я не знаю как можно оптимизировать, в етом всем я новичок :)

кто нибудь может мне помочь?
2 ноя 09, 17:29    [7872828]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
bojeviciok
Запускаю через QA, проходит много времени и никакого результата.
Через ЕМ- timeout expired. Query timeout = 0 , не помогает.

Query timeout не заставит запрос выполняться быстро и оптимально.
2 ноя 09, 17:31    [7872846]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
bojeviciok
Member

Откуда:
Сообщений: 34
Glory
bojeviciok
Запускаю через QA, проходит много времени и никакого результата.
Через ЕМ- timeout expired. Query timeout = 0 , не помогает.

Query timeout не заставит запрос выполняться быстро и оптимально.


А что может заставить?
2 ноя 09, 17:35    [7872893]     Ответить | Цитировать Сообщить модератору
 Re: Top 10. Сложный запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
bojeviciok
Glory
bojeviciok
Запускаю через QA, проходит много времени и никакого результата.
Через ЕМ- timeout expired. Query timeout = 0 , не помогает.

Query timeout не заставит запрос выполняться быстро и оптимально.


А что может заставить?

Оптимизация запроса/блокировок
2 ноя 09, 17:36    [7872910]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить