imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 28.03.2006, 08:09     # 1
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
Создание запроса к БД, вычисляющее повторы

Проблема такая: есть база (вообще Postgres, но sql язык везде один, так что на это можно не обращать внимания), есть таблица:
| id | phone | operator | region |, с такими полями - phone - номер телефона, operator - принадлежность к оператору, region - принадлежность к региону. Нужна статистика звонков, при этом я делаю так: SELECT count(*) FROM table GROUP BY operator, region, соотвестственно для каждой пары регион-оператор у меня есть количество звонков. Теперь нужно следующее - некоторые телефоны повторяются, так вот нужно вычислить количество повторения для конкретного региона-оператора (сначала вычислять все звонки, а потом делать второй запрос - это очень долго), причем очень хотелось бы это запихнуть в один запрос, сделал вот так: SELECT count(*), count(DISTINCT phone) FROM table ....., но это не то слегка - выбирает количество уникальных номеров...
Помогите, плиз
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 28.03.2006, 11:55     # 2
topknot
Junior Member
 
Регистрация: 25.09.2004
Адрес: ніжин
Сообщения: 128

topknot Известность не заставит себя ждатьtopknot Известность не заставит себя ждать
Я не совсем точно понял всё про номера, но предполагаю, что, возможно, тебе нужно уточнить запрос с помощью WHERE region=твой_регион AND WHERE operator=твой_оператор. Количество выбраных записей после этого запроса и будет искомое количество.
topknot вне форума  
Старый 28.03.2006, 12:47     # 3
psel
Junior Member
 
Аватар для psel
 
Регистрация: 12.09.2002
Сообщения: 124

psel Известность не заставит себя ждать
наверное так:
SELECT region, count(phone) FROM имя таблици GROUP BY region
psel вне форума  
Старый 28.03.2006, 14:44     # 4
Slanj
::VIP::
 
Аватар для Slanj
 
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670

Slanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj Сэнсэй
Можно попробовать так (таблицу назвал calls)

SELECT COUNT(PHONE) - COUNT((DISTINCT phone))
FROM calls
GROUP BY operator, region;

У меня в аксесе так не сработало (он count(DISTINCT) не переваривает ), но все таки
Slanj вне форума  
Старый 28.03.2006, 17:13     # 5
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
Цитата:
topknot:
Я не совсем точно понял всё про номера, но предполагаю, что, возможно, тебе нужно уточнить запрос с помощью WHERE region=твой_регион AND WHERE operator=твой_оператор
не совсем - представь, что есть служба в которую звонят, записывается время звонка, номер с которого звонили, регион, и оператор. Так вот если чел позвонил 2 (3, 4,5, или более раз), то у него номер с которого он звонит будет одинаковый вот мне и нужно выбрать количество номеров, которые позвонили больше одного раза...
Цитата:
psel:
SELECT region, count(phone) FROM имя таблици GROUP BY region
что вы к региону-то привязались GROUP BY сгруппирует по региону и будет по сути количество регионов, грубо говоря, и сколько на каждый регион всего позвонило...
Цитата:
Slanj:
SELECT COUNT(PHONE) - COUNT((DISTINCT phone))
FROM calls
GROUP BY operator, region;
Мой вариант (там где просто count(DISTINC phone)) практически повторяет этот, только это неверно:
допустим есть 20 звонков, из них один чел позвонил 2 раза, другой 3 раза и третий 5 раз, остальные соответственно 10 челов позвонили по 1 разу... Так вот DISTINCT нам даст 13 телефонов, а общее количетсво звонков будет 20, т.е. по этому запросу повторных номеров: 7, а на самом деле их всего 3 (первый, второй и третий челы, которые позвонили больше одного раза)...
Все равно всем спасибо за участие, продолжаем думать, может кто еще подскажет
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 28.03.2006, 17:28     # 6
Slanj
::VIP::
 
Аватар для Slanj
 
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670

Slanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj Сэнсэй
Я просто не совсем понял вопрос. Подумал, что нужно просто получить количество повторных звонков, а не номеров, с которых звонили повторно.

Можно так попробовать.

SELECT Count(ucalls.skolko_zvonili) AS povtornih_telefonov
FROM ( SELECT COUNT(calls.phone) AS skolko_zvonili FROM calls GROUP BY calls.phone ) AS ucalls
WHERE ucalls.skolko_zvonili >1;
Slanj вне форума  
Старый 28.03.2006, 17:56     # 7
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
Цитата:
Slanj:
Можно так попробовать.
Все бы было хорошо, только в одном запросе нужно сделать, чтобы выводило и всего звонков и повторных по отдельности-то все делается
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 28.03.2006, 18:09     # 8
Slanj
::VIP::
 
Аватар для Slanj
 
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670

Slanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj СэнсэйSlanj Сэнсэй
Ну, это вы уже придираетесь, батенька .
Slanj вне форума  
Старый 28.03.2006, 18:40     # 9
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
Цитата:
Slanj:
Ну, это вы уже придираетесь, батенька.
...где ж это придираюсь? Спасибо большое за помощь, просто изначально нужно было, чтобы в одном запросе сразу две вещи делал, и общую сумму, и количество повторных...
А в итоге у меня вот что получилось:
Цитата:
SELECT sum(ucalls.count_p), sum(ucalls.countt) FROM (SELECT
CASE
WHEN count(src)>1 THEN 1
ELSE 0
END AS count_p, count(src) AS countt FROM cdr_log WHERE calldate>='20060328 15:00:00' GROUP BY src) AS ucalls WHERE ucalls.countt>=1
Всем Респект!!!
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 02:49.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.