#sql #postgresql #join #summarization
Вопрос:
У меня есть три таблицы с приведенными ниже подробностями:
Таблица 1: рабочий журнал
----------- ------------ -------------
| worklogid | technician | description |
----------- ------------ -------------
| 1 | john | some text |
----------- ------------ -------------
| 2 | jack | some text |
----------- ------------ -------------
| 3 | john | some text |
----------- ------------ -------------
| 4 | jenifer | some text |
----------- ------------ -------------
Таблица 2: задача
-------- ------- -------------
| taskid | owner | description |
-------- ------- -------------
| 1 | john | some text |
-------- ------- -------------
| 2 | john | some text |
-------- ------- -------------
| 3 | john | some text |
-------- ------- -------------
| 4 | jack | some text |
-------- ------- -------------
Таблица 3: запрос
----------- ------------ ----------- -------------
| requestid | technician | title | description |
----------- ------------ ----------- -------------
| 1 | john | some text | ... |
----------- ------------ ----------- -------------
| 2 | sara | some text | ... |
----------- ------------ ----------- -------------
| 3 | john | some text | ... |
----------- ------------ ----------- -------------
| 4 | jack | some text | ... |
----------- ------------ ----------- -------------
Теперь мне нужен SQL-запрос для этого результата:
------------ ------------------ --------------- ------------------
| technician | count(worklogid) | count(taskid) | count(requestid) |
------------ ------------------ --------------- ------------------
| john | 2 | 3 | 2 |
------------ ------------------ --------------- ------------------
| jack | 1 | 1 | 1 |
------------ ------------------ --------------- ------------------
| jenifer | 1 | 0 | 0 |
------------ ------------------ --------------- ------------------
| sara | 0 | 0 | 1 |
------------ ------------------ --------------- ------------------
Что мне делать?
Комментарии:
1. Пожалуйста, укажите ваш текущий запрос.
2. У меня нет никакого представления об этом запросе
3. @GordonLinoff : Таблица 3: запрос
4. Отметьте свой вопрос в базе данных, которую вы используете.
5. Я считаю, что дизайн базы данных должен быть улучшен. Пользователям не назначается первичный ключ или идентификатор.
Ответ №1:
Один из методов состоит в том, чтобы просто использовать union all
и агрегировать:
select techician, sum(is_workid), sum(is_taskid), sum(is_requestid)
from ((select technician, 1 as is_workid, 0 as is_taskid, 0 as is_requestid
from worklog
) union all
(select owner, 0, 1, 0
from task
) union all
(select technician, 0, 0, 1
from request
)
) t
group by technician;
В Postgres вы также можете агрегировать данные перед присоединением:
select *
from (select technician, count(*) as num_workid
from worklog
group by technician
) w full join
(select owner as technician, count(*) as num_task
from task
group by owner
) t
using (technician) full join
(select technician, count(*) as num_request
from request
group by technician
) w
using (technician);
С a full join
я нахожу , что using
это проще, чем on
предложения. Но имя должно быть одинаковым во всех таблицах.
Комментарии:
1. Мне нужно посчитать каждую запись
2. Ошибка меня: Всякий раз, когда подзапрос используется в предложении from, пожалуйста, используйте псевдоним для подзапроса @GordonLinoff
3. @EhsanAli . . . У этого есть псевдоним,
t
.