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

Откуда:
Сообщений: 17
Добрый день!
Подскажите, нужно получить количество выполненных и назначенных запросов, но при выводе получаем два одинаковых столбца с количеством выполненных запросов, подозреваю что где-то спряталась логическая ошибка (у селектов немного разное условие и присоединение к таблице tbl_employee производится различными ключами), но не пойму где


select
e.title AS "ФИО сотрудника",
count (distinct sc.id) as "Количество Назначенных запросов",
count (distinct sc1.number_) as "Количество Выполненных запросов"
from tbl_servicecall sc
join tbl_servicecall sc1 on sc.number_=sc1.number_
join tbl_log tl on tl.story$request=sc.id
join tbl_employee e on e.id=tl.story$currentresp_em
join tbl_ou ou on ou.id=e.parent_id
where
tl.story$currstatecode='firstLine'
and tl.story$prevstatecode='waitfirstLine'
and sc.creation_date between current_date and current_date+1
and ou.title like 'Отдел'
and sc1.id in (select distinct sc2.id
from tbl_servicecall sc2
left join tbl_employee e on e.id=sc2.solvedbyemployee_id
left join tbl_ou ou on ou.id=e.parent_id
left join tbl_employee e1 on e1.id=sc2.resp2line_em
where sc2.datedecision between current_date and current_date+1 -- выполнено за сегодня
and ou.title like 'Отдел')
GROUP BY e.title
ORDER BY e.title

К сообщению приложен файл. Размер - 32Kb


Сообщение было отредактировано: 1 июн 21, 14:11
1 июн 21, 14:19    [22329826]     Ответить | Цитировать Сообщить модератору
 Re: Селект задваиает столбцы  [new]
court
Member

Откуда:
Сообщений: 2335
+
Александр Кузьминов
Добрый день!
Подскажите, нужно получить количество выполненных и назначенных запросов, но при выводе получаем два одинаковых столбца с количеством выполненных запросов, подозреваю что где-то спряталась логическая ошибка (у селектов немного разное условие и присоединение к таблице tbl_employee производится различными ключами), но не пойму где


select 
e.title AS "ФИО сотрудника",
count (distinct sc.id) as "Количество Назначенных запросов",
count (distinct sc1.number_) as "Количество Выполненных запросов"
	from tbl_servicecall sc
join tbl_servicecall sc1 on sc.number_=sc1.number_
join tbl_log tl on tl.story$request=sc.id
join tbl_employee e on e.id=tl.story$currentresp_em
join tbl_ou ou on ou.id=e.parent_id
	where 
tl.story$currstatecode='firstLine'
and tl.story$prevstatecode='waitfirstLine'
and sc.creation_date between current_date and current_date+1
and ou.title like 'Отдел'
and sc1.id in (select distinct sc2.id
				from tbl_servicecall sc2
			  	left join tbl_employee e on e.id=sc2.solvedbyemployee_id
				left join tbl_ou ou on ou.id=e.parent_id
				left join tbl_employee e1 on e1.id=sc2.resp2line_em
			    where sc2.datedecision between current_date and current_date+1 -- выполнено за сегодня
			    and ou.title like 'Отдел')   
GROUP BY e.title
ORDER BY e.title 


Картинка с другого сайта.

считай агрегаты ДО джойнов. В CTE или в подзапросе (derived table)
а потом доджойнивай всё что нужно

пс
подзапрос для sc1.id in (... - жуткая жуть !

Сообщение было отредактировано: 1 июн 21, 14:22
1 июн 21, 14:30    [22329839]     Ответить | Цитировать Сообщить модератору
 Re: Селект задваиает столбцы  [new]
Александр Кузьминов
Member

Откуда:
Сообщений: 17
court, не совсем понял ответ, при использовании CTE столбец Назначено тиражируется на всех сотрудников общим значением

with recursive serv (title, number_, id) AS (
select
e.title,
ts.number_,
ts.id as num
from tbl_servicecall ts
left join tbl_employee e on e.id=ts.solvedbyemployee_id
left join tbl_ou ou on ou.id=e.parent_id
left join tbl_employee e1 on e1.id=ts.resp2line_em
where
ts.datedecision between current_date and current_date+1 -- выполнено за сегодня
and ou.title like 'Отдел ИТ-поддержки пользователей'
Group BY e.title, ts.id
union all
select
e.title,
ts1.number_,
serv.id+1
from tbl_servicecall ts
join serv on ts.number_ = serv.id
left join tbl_employee e on e.id=ts.solvedbyemployee_id
left join tbl_ou ou on ou.id=e.parent_id
left join tbl_employee e1 on e1.id=ts.resp2line_em
join tbl_servicecall ts1 on ts.id = ts1.id
--
left join tbl_log tl on tl.story$request=ts1.id
join tbl_employee e2 on e2.id=tl.story$currentresp_em
where
ou.title like 'Отдел ИТ-поддержки пользователей'
and tl.story$currstatecode='firstLine'
and tl.story$prevstatecode='waitfirstLine'
and ts1.creation_date between current_date and current_date+1
)
select
distinct serv.title as "ФИО",
count (distinct serv.id) as "Выполненно",
(select count(serv.number_) from serv) as "Назначено"
from serv
group by serv.title

К сообщению приложен файл. Размер - 31Kb


Сообщение было отредактировано: 1 июн 21, 16:45
1 июн 21, 16:45    [22329943]     Ответить | Цитировать Сообщить модератору
 Re: Селект задваиает столбцы  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
Александр Кузьминов,

Ну так берете убираете из запроса всю дополнительную муть и на минимальном примере смотрите что у вас в результатах промежуточных.
Там сразу все становится понятно обычно.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
1 июн 21, 17:07    [22329961]     Ответить | Цитировать Сообщить модератору
 Re: Селект задваиает столбцы  [new]
court
Member

Откуда:
Сообщений: 2335
Александр Кузьминов
столбец Назначено тиражируется на всех сотрудников общим значением

нуу ещё бы !
Александр Кузьминов
select
distinct serv.title as "ФИО",
count (distinct serv.id) as "Выполненно",
(select count(serv.number_) from serv) as "Назначено"
from serv
group by serv.title

а что это (выделил) должно возвращать ?
и при чём здесь рекурсия ... ?

вообщем, начни с "простого"
1
https://www.sql.ru/faq/faq_topic.aspx?fid=202
2
пример данных, - результат на этих данных
1 июн 21, 17:10    [22329962]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить