Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Логика построения запроса / 6 сообщений из 6, страница 1 из 1
03.07.2020, 15:08
    #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
04.07.2020, 00:27
    #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
05.07.2020, 18:44
    #39976473
DeLipFin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логика построения запроса
Flashpoke,
Почему то не воспринимает команду filter, да если честно и не понял принцип ваш
...
Рейтинг: 0 / 0
05.07.2020, 18:52
    #39976475
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логика построения запроса
DeLipFin
Flashpoke,
Почему то не воспринимает команду filter, да если честно и не понял принцип ваш

У вас видимо версия PostgreSQL <9.4.
...
Рейтинг: 0 / 0
05.07.2020, 20:53
    #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
05.07.2020, 21:55
    #39976508
DeLipFin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логика построения запроса
Swa111,
Да вы правы, допустил ошибку в примере.
Почему такая формула?
Потому что в базе есть строки без столбца сервиса к которым я не присваивал коэффициент.
1)По формуле складываются сервисы умноженные на коэфф.
2)дальше складываются с остатками, которые без сервисов были, а остатки в свою очередь находятся из периода поиска и вычитания найденных сервисов
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Логика построения запроса / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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