powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Логика построения запроса
6 сообщений из 6, страница 1 из 1
Логика построения запроса
    #39975953
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, помогите прийти к выводу как будет выглядеть запрос. Есть например 2 таблицы как на скриншоте.

То что понятно и легко:
Для начало, нужно вывести такую информацию как Агент, Блок, День, Месяц, Все_время

Отображает количество строк у responsible X с статусом 1 (на самом деле id статусов больше 2)
Код: plsql
1.
(select count(id) as Блок from table2 where responsible=X and ticket_state_id!=2)


Отображает количество строк у user X с статусом 2 за день
Код: plsql
1.
(select count(id) as День from table2 where change_time>=current_date and user_id=X and state_id=2)


Отображает количество строк у user X с статусом 2 за месяц
Код: plsql
1.
(select count(id) as Месяц from table2 where change_time>=date_trunc('month',current_date) and user_id=X and state_id=2)


Отображает количество строк у user X с статусом 2 за все время
Код: plsql
1.
(select count(id) as Все_время from table2 where user_id=X and state_id=2)



Дальше идет интересное , к каждой service_id идет коэффициент с table1. (дальше будут употребляться столбцы table1)
Нужно по каждому агенту вывести баллы за день, месяц и все время
Код: plsql
1.
sum(id*k1)+День/Месяц/Все_время (зависит от периода) - sum(id*k2) 	(есть моменты что table2.service_id=[null],тогда без сервиса считается за 1) 


Например по скриншоту разберем агента 1, допустим сервис 1 был в периоде месяца, а сервис 5 годом ранее.
Видно что у него две строки с сервисами 1 и 5.

Результат будет такой
Код: plsql
1.
2.
Агент	| День_баллы	| Месяц_баллы 	| Все_время_баллы
  1	|     0		|	0,5	|	1,5



Конечный результат должен выглядеть так, данные не связанны со скриншотом!
Код: plsql
1.
2.
3.
4.
5.
Агент	|	Блок	|	День	|	День_баллы	|	Месяц	|	Месяц_баллы	|	Все_время	|	Все_время_баллы
  1	|	1	|	4	|	3,5		|	24	|	74,5		|	431		|	1134,5
  2	|	0	|	3	|	2,5		|	12	|	24,5		|	31		|	64,5
  3	|	0	|	0	|	0		|	1	|	1,5		|	1		|	1,5
  4	|	3	|	1	|	0,5		|	2	|	2		|	33		|	94,5  



На данный момент юзается такой запрос с одной таблицей. Три *** это перебор всех сервисов с 1 по 67, где к каждому присваивается имя, еще когда за месяц новые имена, за все время тоже новые имена. Есть вариант как обойти этот громадный код? Это только для одного агента, для другого идет union all, а агентом много. Пробывал через group by, но не хватает мозгов.
В данный момент на одного агента выходит 170 строк.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select text 'агент' as сотрудник, block, today, (пвд*2+...+почта*3,5)+(today-(пвд+...+почта)) as tod_point, month, (пвдй*2+...+почтай*3,5)+(month-(пвдй+...+почтай)) as mon_point, 
alll, (пвдйй*2+...+почтайй*3,5)+(alll-(пвдййй+...+почтаййй)) as all_point
from (select count(id) as пвд,
***
(select count(id) as почта	from ticket where change_time>=date_trunc('month',current_date) and user_id=82 and state_id in (2,3,5,7,8,9) and service_id=67),

(select count(id) as пвдй	from ticket where change_time>=current_date and user_id=82 and state_id in (2,3,5,7,8,9) and service_id=1),
***
(select count(id) as почтай	from ticket where change_time>=current_date and user_id=82 and state_id in (2,3,5,7,8,9) and service_id=67),

(select count(id) as пвдййй	from ticket where user_id=82 and state_id in (2,3,5,7,8,9) and service_id=1),
***
(select count(id) as почтаййй	from ticket where user_id=82 and state_id in (2,3,5,7,8,9) and service_id=67),

(select count(id) as today	from ticket where change_time>=current_date and user_id=82 and state_id in (2,3,5,7,8,9)),
(select count(id) as month	from ticket where change_time>=date_trunc('month',current_date) and user_id=82 and state_id in (2,3,5,7,8,9)),
(select count(id) as alll	from ticket where user_id=82 and ticket_state_id in (2,3,5,7,8,9)),
(select count(id) as block	from ticket where responsible=82 and state_id not in (2,3,5,7,8,9) and queue_id=1)
	from ticket where change_time>=date_trunc('month',current_date) and user_id=82 and state_id in (2,3,5,7,8,9) and service_id=1) ticket
...
Рейтинг: 0 / 0
Логика построения запроса
    #39976109
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так:
Код: sql
1.
2.
3.
4.
select 
count(id) as почта filter(where change_time>=date_trunc('month',current_date) and user_id=82 and state_id in (2,3,5,7,8,9) and service_id=67),
count(id) as пвдй filter(where change_time>=current_date and user_id=82 and state_id in (2,3,5,7,8,9) and service_id=1)
from ticket


И так далее.
...
Рейтинг: 0 / 0
Логика построения запроса
    #39976473
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flashpoke,
Почему то не воспринимает команду filter, да если честно и не понял принцип ваш
...
Рейтинг: 0 / 0
Логика построения запроса
    #39976475
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeLipFin
Flashpoke,
Почему то не воспринимает команду filter, да если честно и не понял принцип ваш

У вас видимо версия PostgreSQL <9.4.
...
Рейтинг: 0 / 0
Логика построения запроса
    #39976494
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeLipFin,

Что то с примерами у Вас все как то скомкано. Как получилось за все время 1,5?

1(s1) * 0.5 + 1(s5) * 1.5 + 2(Cnt Всего) - (1(s1) * 1 + 1(s5) * 1) = 2

Учитесь четче формулировать задачи с расчетом на то что форумчание в специфике Вашего вопроса не разбираются. Возможно пока формулируете вопрос и ответ сами найдете.

не понятно зачем вообще нужны 2 коэффициента если по сути все сводится к одному K = k1 + 1 - k2. Или же Вы не правильно объяснили их предназначение.
...
Рейтинг: 0 / 0
Логика построения запроса
    #39976508
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111,
Да вы правы, допустил ошибку в примере.
Почему такая формула?
Потому что в базе есть строки без столбца сервиса к которым я не присваивал коэффициент.
1)По формуле складываются сервисы умноженные на коэфф.
2)дальше складываются с остатками, которые без сервисов были, а остатки в свою очередь находятся из периода поиска и вычитания найденных сервисов
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Логика построения запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]