В моем запросе SQL как мне получить столбец со значениями, запрашиваемыми из другой таблицы? - PullRequest
2 голосов
/ 18 января 2020

Это запрос, который я создал, чтобы получить список команд, в которые входит пользователь:

select user_teams.team_id, teams.team_name from
(
    select distinct(team_id) from workflows where workflow_id in (
        select workflow_id from user_workflows where user_name in
        (
            'johndoe'
        )
    )
) user_teams join tbl_teams teams on user_teams.team_id = teams.team_id;

Результат выглядит следующим образом:

team_id    team_name
1          Team A
5          Team E

Как я могу добавить еще один столбец, значением которого будет количество рабочих процессов из этой команды, назначенных пользователю?
(я могу найти это в таблице рабочих процессов и таблицы user_workflows)

Это должно выглядеть следующим образом:

user_name    team_id    team_name    workflow_count
johndoe       1          Team A       127
johndoe       5          Team E       96

Я создал этот запрос, но не могу понять, как добавить его результат в новый столбец на основе team_id и user_name из предыдущего query:

select count(distinct(workflow_id, user_name)) from user_workflows
where user_name = 'johndoe'
and workflow_id in
(
    select workflow_id from workflows where team_id in
    (
        select team_id from tbl_teams where team_name in ('Team A')
    )
)

Любые советы о том, как мне этого добиться?

РЕДАКТИРОВАТЬ:

Добавление определения таблицы:

tbl_teams(team_id bigserial, team_name text)

workflows(workflow_id bigserial, team_id int8 references(tbl_teams(team_id)), workflow_name)

user_workflows(user_workflow_id bigserial, workflow_id int8 references(workflows(workflow_id)), user_name text)

Добавление примеров данных:

tbl_teams:
team_id    team_name
1          Team A
2          Team B
3          Team C
4          Team D
5          Team E

workflows:
workflow_id    team_id    workflow_name
1              1          Audit
2              1          Refund
3              3          Purchase
4              4          Discontinue
5              3          Payment

user_workflows:
user_workflow_id    workflow_id    user_name
1                   1              johndoe
2                   1              janedoe
3                   1              alex
4                   3              ron
5                   5              stacey
6                   2              johndoe
7                   2              janedoe
8                   5              ron
9                   5              johndoe

Идеальный результат запроса:

user_name    team_id    team_name    workflow_count
johndoe      1          Audit        2
johndoe      3          Payment      1
alex         1          Audit        1
ron          3          Purchase     2

Ответы [ 2 ]

3 голосов
/ 18 января 2020

Если я правильно понимаю, вы просто хотите запрос агрегации:

select uw.username, uw.team_id, t.teamname, count(*) as num_workflows
from user_workflows uw join
     tbl_teams t
     on uw.team_id = t.team_id
where uw.username = 'johndoe'
group by uw.username, uw.team_id, t.teamname;

Подзапросы не кажутся необходимыми для этого или для вашего исходного запроса.

1 голос
/ 18 января 2020

Идет ли это близко к тому, что вам нужно:

select uw.user_name
       , tt.team_id
       , tt.team_name
       , count(*) workflow_count
from tbl_teams tt
left join workflows w on tt.team_id = w.team_id
left join user_workflows uw on uw.workflow_id = w.workflow_id
where uw.user_name = 'johndoe'
--and tt.team_name = 'Team A'
group by uw.user_name, tt.team_id, tt.team_name

Если вам потребуется отфильтровать его по команде, вы можете удалить закомментированную строку.

Вот комментарий ОП как дополнительная информация:

Чтобы добавить к ответу, в таблице user_workflows было несколько повторяющихся записей, поэтому для получения правильного количества я изменил

count(*) workflow_count

до

count(distinct(uw.workflow_id, uw.user_name))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...