Суммируйте количество нескольких таблиц в одном SQL-запросе

#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 .