Помогите с запросом
Помогите с запросом
Помогите с запросом - чую, что сделать можно, но моск на этом месте затупил, и никак не соображу:
есть поле с кодом клиентов (FK) и поле даты контакта с клиентом, нужно получить количество тех клиентов, чей код за определенный период мелькнул в таблице 2 и более раз. FB 1.5, ХП и посмотры не подходят, нужен только запрос, возвращающий одно число.
есть поле с кодом клиентов (FK) и поле даты контакта с клиентом, нужно получить количество тех клиентов, чей код за определенный период мелькнул в таблице 2 и более раз. FB 1.5, ХП и посмотры не подходят, нужен только запрос, возвращающий одно число.
Re: Помогите с запросом
select T.ClientId. count(*) CNT from Table T_sts_ писал(а):Помогите с запросом - чую, что сделать можно, но моск на этом месте затупил, и никак не соображу:
есть поле с кодом клиентов (FK) и поле даты контакта с клиентом, нужно получить количество тех клиентов, чей код за определенный период мелькнул в таблице 2 и более раз. FB 1.5, ХП и посмотры не подходят, нужен только запрос, возвращающий одно число.
where T.ClientDt between :d1 and :d2
having count(*) > 1
Здесь ClientId - код клиента;
ClientDt- дата контакта
Re: Помогите с запросом
Запрос должен вернуть ОДНО число, а ты намекаешь на группировку (правда GROUP BY где-то потерялSAMZ писал(а):
select T.ClientId. count(*) CNT from Table T
where T.ClientDt between :d1 and :d2
having count(*) > 1
Здесь ClientId - код клиента;
ClientDt- дата контакта

Он жы сказал "без ХП и вья". Надо бы ответить "не ..би моск, делай ХП".
Вообще, типа так
Вообще, типа так
Код: Выделить всё
select count(c.client_id)
from clients c
where c.date between :d1 and :d2 and
exists (select client_id
from clients
where date between :d1 and :d2 and
client_id = c.client_id
group by client_id
having count(*) >= 2
)
Re: Помогите с запросом
Черт, не подумал и потер_sts_ писал(а): Запрос должен вернуть ОДНО число, а ты намекаешь на группировку (правда GROUP BY где-то потерял, т.е. нужен каунт от каунта ... вот в чем проблема
Гы-гы-гы - это вы, батенька, зря. Придется пояснять подробнейMerlin писал(а):Вьё.
Упс, они ж по религиозным соображениям не подходят. Странно это. Ну тогда фетчить этот запрос и загибать пальцы на клиенте. Гы-гы-гы.

Прога разошлась по городам и весям, а чтобы иметь возможность подстроиться под заморочки каждого юзверя, в ней есть возможность подключения текстового файла с запросом, который (запрос) всегда ограничен диапазоном дат (так надо!) Поэтому ХП тут не катит, хотя согласен, здесь бы - самое оно. Но дистанционно создавать ХП, т.е. изменять структуру базы, я не могу. Не могу и не хочу.
А подсунуть ей два раза текстовый файлик, первый с креате вью, второй с грант его возжелавшему юзверю, папа не разрешает?_sts_ писал(а): Прога разошлась по городам и весям, а чтобы иметь возможность подстроиться под заморочки каждого юзверя, в ней есть возможность подключения текстового файла с запросом

Проверял - неправильно считает.WildSery писал(а):Он жы сказал "без ХП и вья". Надо бы ответить "не ..би моск, делай ХП".
Вообще, типа такКод: Выделить всё
select count(c.client_id)... )
А как вам такой результат насилия над моском:
Код: Выделить всё
select count(distinct t.kod) "Контактов>1" from Tab t
where t.kod = any (select t.kod from tab t
where t.dat between '01.01.2006' and '31.12.2009'
group by t.kod
having count(t.kod)>1 )

P.S. Спасибо всем за участие

Верю-верюWildSery писал(а):Полторашки у меня нету, на 2-ке и на 1-це правильно считал. Перепроверять не буду, потому что нихачу._sts_ писал(а):Проверял - неправильно считает.

Вдогонку: я понял, в чем дело - у тебя считаются все строки с такими кодами, а мне нужно кол-во клиентов, т.е. distincta не хватает. А так все верно...
Понятно. (Но индекса там нет)WildSery писал(а):Потому что это как бы два разных запроса, и если в кореллирующем подзапросе подхватится фильтр по дате (при наличии соотв. индекса), запрос будет выполняться быстрее._sts_ писал(а):зачем дублировать between по дате?
И еще: у Helen Borry видел такой пример:
select sum(count (подзапрос с группировкой) ....), но сколько ни парился, повторить подобную хрень так и не смог. Вообще такое возможно в принципе (т.е. агрегат по полю, кот. строится как рез-т агрегата?)
Нет, двойного агрегата нет нигде. И в стандарте в том числе 
Зато с 2-ки можно так:

Зато с 2-ки можно так:
Код: Выделить всё
select sum(cnt) from
(select id, count(id) as cnt from table group by 1 having count(id)>1) q
Круто. Кстати, как там с двойкой - все глюки исправили?WildSery писал(а): Зато с 2-ки можно так:Код: Выделить всё
select sum(cnt) from (select id, count(id) as cnt from table group by 1 having count(id)>1) q
И вообще - ради чего стоит на нее переходить с полторашки?
(Обзоры читал, мне интересно мнение практика)
WildSery писал(а):А что, в полторашке все глюки исправили?

ЗЫ: Я с 1.0.3 на 2.0.3 наши БД перевожу.
-И это правильно
P.S. Поспал, расслабился, попил пивка - ешкн кот, а твой и мой вариант запроса - этож одно и тоже

А вчера реально считал, что они разные ...

Вывод - отдыхать надо вовремя. Щас достал бутыль винца домашнего, сбегал за шоколадкой, купил какойто детективчик (а-ля Код да Винчи), пойду устрою праздник моска...
А топик, пожалуй, пора закрыть