Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Group by по всем столбцам  [new]
DeLipFin
Member

Откуда:
Сообщений: 34
Добрый день!
Помогите разобраться как сгруппировать все столбцы, если такое возможно.
Примечание: значения user_id и responsible_user_id(используется в столбце "заблок") равны.
Вот примерно как я вижу запрос, примерный результат на скрине.
Уже устал с этим запросом, готов даже заплатить за работу.

select (case user_id=x then 'Ivan' end) as сотрудник, заблок, сегодня, sum(a1..a73) as today, месяц, sum(ab1..ab73) as month, всего, sum(abc1..abc73) as all	
from 
(select count(id)*1.0 as a1,
(select count(id)*6.0 as a2	from ticket where change_time>=date_trunc('month',current_date) and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=2),
...(73 строки с разным service_id)
(select count(id)*2.5 as a73	from ticket where change_time>=date_trunc('month',current_date) and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=73),

(select count(id)*1.0 as ab1	from ticket where change_time>=current_date and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=1),
...(73 строки с разным service_id)
(select count(id)*2.5 as ab73	from ticket where change_time>=current_date and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=73),

(select count(id)*6.0 as abc1	from ticket where user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=1),
...(73 строки с разным service_id)
(select count(id)*2.5 as abc73	from ticket where user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=73),

(select count(id) as месяц	from ticket where change_time>=date_trunc('month',current_date) and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)),
(select count(id) as сегодня 	from ticket where change_time>=current_date and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)),
(select count(id) as всего	from ticket where user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)),
(select count(id) as заблок	from ticket where responsible_user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id not in (2,3,5,7,8,9))
				from ticket where change_time>=date_trunc('month',current_date) and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=1) ticket


К сообщению приложен файл. Размер - 5Kb
29 июл 20, 10:38    [22175001]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8782
вызов ф-ции
select count(*) from table
select max(имя_поля) from table

ровно это и выполняет, группирует по всем столбцам

Что у Вас за задача и в чем проблемма, совершенно не понятно.

https://www.sql.ru/forum/132692/pravila-foruma-prochtite-pered-tem-kak-zadavat-vopros?mid=16726098#16726098

...Точно и детально опишите проблему...
...Приложите полноценные исходники и файлы для тестов...
29 июл 20, 16:15    [22175261]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8782
Смысла Вышего мега select'а полученного copy past где только в зависимости от service применяется разный коэф расчета - я не понимаю совершенно

Я бы просто сделал табличку со справочником service_id коэф. на который нужно умножить. Зачем плодить 100500 полей в подзапросе - я не понимаю совершенно.
29 июл 20, 16:34    [22175272]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
Flashpoke
Member

Откуда:
Сообщений: 26
Странные условия фильтрации, ну да ладно.

select  
	sum(cnt) filter(where group_name='заблок') as "заблок",
	sum(cnt) filter(where group_name='сегодня') as "сегодня", 
	sum(cnt) filter(where group_name='a') as "today", 
	sum(cnt) filter(where group_name='месяц') as "месяц", 
	sum(cnt) filter(where group_name='ab') as "month", 
	sum(cnt) filter(where group_name='всего') as "всего", 
	sum(cnt) filter(where group_name='abc') as "all"
from (
	select count(id)*1.0 as cnt, 'a' as group_name
	union all
	select count(id)*6.0, 'a' from ticket where change_time>=date_trunc('month',current_date) and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=2
	union all
	...
	union all
	select count(id)*2.5, 'a' from ticket where change_time>=date_trunc('month',current_date) and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=73
	union all
	...
	union all
	select count(id)*1.0, 'ab' from ticket where change_time>=current_date and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=1
	union all
	...
	select count(id)*2.5, 'ab' from ticket where change_time>=current_date and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=73
	union all
	...
	select count(id)*6.0, 'abc' from ticket where user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=1
	union all
	...
	union all
	select count(id)*2.5, 'abc' from ticket where user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9) and service_id=73
	union all
	...
	union all
	select count(id), 'месяц' from ticket where change_time>=date_trunc('month',current_date) and user_id in 24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)
	union all
	select count(id), 'сегодня' from ticket where change_time>=current_date and user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)
	union all
	select count(id), 'всего' from ticket where user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)
	union all
	select count(id), 'заблок' from ticket where responsible_user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id not in (2,3,5,7,8,9)
) as t


Как-то так. Сотрудника добавь сам.
30 июл 20, 21:38    [22175890]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
court
Member

Откуда:
Сообщений: 2017
Leonid Kudryavtsev
Я бы просто сделал табличку со справочником service_id коэф. на который нужно умножить. Зачем плодить 100500 полей в подзапросе - я не понимаю совершенно.

+1

ровно тоже самое, я предлагал ТС-у 2-а месяца назад :) 22143317

тут, походу, "глобальная" проблема: человек просто не понимает как это оно работать с множествами
Все эти его 100500 подзапросов - это получение/загрузка значения в переменную
Такое впечатление, что ТС просто "переводит" код из какого-то императивного ЯПа на СКЛ "один к одному" :)
31 июл 20, 07:01    [22175919]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
DeLipFin
Member

Откуда:
Сообщений: 34
Leonid Kudryavtsev,

А как через таблицу сделать то, чтобы копипаста не было? Группировка нужна мне по user_id и responsible_user_id.
Есть куча сервисов, я проверяю по каждому сотруднику статусы за день, месяц и все время.
От сюда и выходит очень большой запрос, где по каждому сервису проверяются строки по условию, в сумме по сервисам только 73+73+73=219 строк на одного сотрудника, а нужно как то группировку сделать по user_id.
Мне хотя бы пример или шаблон нужен, чтобы понять как реализовать это.
3 авг 20, 12:02    [22176961]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
DeLipFin
Member

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

Вы наверно не так поняли, то что я скинул по сути был для одного сотрудника, но я добавил там user_id in (24,82,76,80,73,44,41,63,70,71,57), чтобы как то группировку сделать.
по вашему запросу выходит сумма всех User_id, а их надо разделить по строкам, 1 строка показывает результат user_id=24 и так далее
Во вложение результат вашего запроса

К сообщению приложен файл. Размер - 8Kb
3 авг 20, 12:08    [22176969]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
Flashpoke
Member

Откуда:
Сообщений: 26
DeLipFin, теперь понял, зачем это всё.
Как уже говорили, нужно создать таблицу с коэффициентами по сервисам.

service_idcoeff
11.0
26.0
......
722.5


И как-то так использовать:
SELECT
  user_id,
  sum(cnt_day) AS "сегодня",
  sum(cnt_day * coeff) AS "today",
  sum(cnt_month) AS "месяц",
  sum(cnt_month * coeff) AS "month",
  sum(cnt_all) AS "всего",
  sum(cnt_all * coeff) AS "all"  
FROM (
    SELECT 
    user_id, 
    service_id,
    count(*) FILTER (WHERE change_time >= current_date) AS cnt_day, 
    count(*) FILTER (WHERE change_time >= date_trunc('month', current_date)) AS cnt_month,
    count(*) AS cnt_all
  FROM ticket
  WHERE user_id in (24,82,76,80,73,44,41,63,70,71,57) and ticket_state_id in (2,3,5,7,8,9)
  GROUP BY user_id, service_id) AS t
JOIN service_coeff USING (service_id)  
GROUP BY user_id

Если это подходит, можно поговорить насчёт "заблок".
5 авг 20, 00:05    [22177683]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
DeLipFin
Member

Откуда:
Сообщений: 34
Flashpoke,
Спасибо большое, с запросом все получилось!
Сейчас более менее логику понимаю, теперь как можно еще добавить столбец с responsible_user_id

К сообщению приложен файл. Размер - 35Kb
5 авг 20, 13:30    [22177924]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
Flashpoke
Member

Откуда:
Сообщений: 26
DeLipFin
теперь как можно еще добавить столбец с responsible_user_id

Сабселектом в селекте, например.
Но зачем, если responsible_user_id совпадает с user_id?
И который именно, если данные были агрегированы по user_id?
5 авг 20, 19:23    [22178179]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
DeLipFin
Member

Откуда:
Сообщений: 34
Flashpoke,
Да эти id совпадают по сотрудникам. Смысл таков, что приходит заявка в ней есть параметры как владелец (user_id) и ответственный (responsible_user_id). Когда заявку выполняет сотрудник и закрывает ее, владелец меняется на него.
То что я скидывал последним скрином, он искал заявки по status_id=закрытые заявки и по владельцу. Так же к заявке можно назначить ответственное лицо, по запросу он выводил количество заявок где присутствует ответственный и status_id=новая заявка или открытая.

Про "Сабселектом в селекте" ничего сказать не могу, так как никогда не сталкивался с таким.
В основном я писал все свои запросы из примеров, и построение запросов было легкое и громадным.
7 авг 20, 07:12    [22178900]     Ответить | Цитировать Сообщить модератору
 Re: Group by по всем столбцам  [new]
Flashpoke
Member

Откуда:
Сообщений: 26
DeLipFin,
Я это к тому, что в последнем скрине уже нет никаких заявок (они были сагрегированы), есть только юзеры.
Поэтому можно разве что пришить к запросу отдельное вычисление с дополнительным условием - что список ответственных юзеров совпадает с тем, по которым мы агрегировали.

SELECT
  user_id,
  sum(cnt_day) AS "сегодня",
  sum(cnt_day * coeff) AS "today",
  sum(cnt_month) AS "месяц",
  sum(cnt_month * coeff) AS "month",
  sum(cnt_all) AS "всего",
  sum(cnt_all * coeff) AS "all",
  (SELECT count(*) FROM ticket WHERE responsible_user_id = t.user_id AND ticket_state_id NOT IN (2,3,5,7,8,9)) AS "заблок"
FROM (
    SELECT 
    user_id, 
    service_id,
    count(*) FILTER (WHERE change_time >= current_date) AS cnt_day, 
    count(*) FILTER (WHERE change_time >= date_trunc('month', current_date)) AS cnt_month,
    count(*) AS cnt_all
  FROM ticket
  WHERE user_id IN (24,82,76,80,73,44,41,63,70,71,57) AND ticket_state_id IN (2,3,5,7,8,9)
  GROUP BY user_id, service_id) AS t
JOIN service_coeff USING (service_id)  
GROUP BY user_id
8 авг 20, 17:15    [22179597]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить