powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Group by по всем столбцам
12 сообщений из 12, страница 1 из 1
Group by по всем столбцам
    #39984851
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Помогите разобраться как сгруппировать все столбцы, если такое возможно.
Примечание: значения user_id и responsible_user_id(используется в столбце "заблок") равны.
Вот примерно как я вижу запрос, примерный результат на скрине.
Уже устал с этим запросом, готов даже заплатить за работу.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39985027
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вызов ф-ции
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

...Точно и детально опишите проблему...
...Приложите полноценные исходники и файлы для тестов...
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39985035
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысла Вышего мега select'а полученного copy past где только в зависимости от service применяется разный коэф расчета - я не понимаю совершенно

Я бы просто сделал табличку со справочником service_id коэф. на который нужно умножить. Зачем плодить 100500 полей в подзапросе - я не понимаю совершенно.
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39985441
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странные условия фильтрации, ну да ладно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
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



Как-то так. Сотрудника добавь сам.
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39985457
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Я бы просто сделал табличку со справочником service_id коэф. на который нужно умножить. Зачем плодить 100500 полей в подзапросе - я не понимаю совершенно.

+1

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

тут, походу, "глобальная" проблема: человек просто не понимает как это оно работать с множествами
Все эти его 100500 подзапросов - это получение/загрузка значения в переменную
Такое впечатление, что ТС просто "переводит" код из какого-то императивного ЯПа на СКЛ "один к одному" :)
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39986093
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

А как через таблицу сделать то, чтобы копипаста не было? Группировка нужна мне по user_id и responsible_user_id.
Есть куча сервисов, я проверяю по каждому сотруднику статусы за день, месяц и все время.
От сюда и выходит очень большой запрос, где по каждому сервису проверяются строки по условию, в сумме по сервисам только 73+73+73=219 строк на одного сотрудника, а нужно как то группировку сделать по user_id.
Мне хотя бы пример или шаблон нужен, чтобы понять как реализовать это.
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39986098
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flashpoke,

Вы наверно не так поняли, то что я скинул по сути был для одного сотрудника, но я добавил там user_id in (24,82,76,80,73,44,41,63,70,71,57), чтобы как то группировку сделать.
по вашему запросу выходит сумма всех User_id, а их надо разделить по строкам, 1 строка показывает результат user_id=24 и так далее
Во вложение результат вашего запроса
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39986539
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeLipFin, теперь понял, зачем это всё.
Как уже говорили, нужно создать таблицу с коэффициентами по сервисам.

service_idcoeff11.026.0......722.5

И как-то так использовать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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


Если это подходит, можно поговорить насчёт "заблок".
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39986678
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flashpoke,
Спасибо большое, с запросом все получилось!
Сейчас более менее логику понимаю, теперь как можно еще добавить столбец с responsible_user_id
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39986860
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeLipFin
теперь как можно еще добавить столбец с responsible_user_id

Сабселектом в селекте, например.
Но зачем, если responsible_user_id совпадает с user_id?
И который именно, если данные были агрегированы по user_id?
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39987317
DeLipFin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flashpoke,
Да эти id совпадают по сотрудникам. Смысл таков, что приходит заявка в ней есть параметры как владелец (user_id) и ответственный (responsible_user_id). Когда заявку выполняет сотрудник и закрывает ее, владелец меняется на него.
То что я скидывал последним скрином, он искал заявки по status_id=закрытые заявки и по владельцу. Так же к заявке можно назначить ответственное лицо, по запросу он выводил количество заявок где присутствует ответственный и status_id=новая заявка или открытая.

Про "Сабселектом в селекте" ничего сказать не могу, так как никогда не сталкивался с таким.
В основном я писал все свои запросы из примеров, и построение запросов было легкое и громадным.
...
Рейтинг: 0 / 0
Group by по всем столбцам
    #39987788
Flashpoke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeLipFin,
Я это к тому, что в последнем скрине уже нет никаких заявок (они были сагрегированы), есть только юзеры.
Поэтому можно разве что пришить к запросу отдельное вычисление с дополнительным условием - что список ответственных юзеров совпадает с тем, по которым мы агрегировали.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Group by по всем столбцам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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