Отображение суммы COUNT () в правильной строке записи - PullRequest
3 голосов
/ 07 мая 2019

1. Постановка задачи

Мне трудно отобразить сумму COUNT() в правильном ряду записи.

Как отобразить COUNT() для соответствующей соответствующей службы, которая

2. Фон

Я хочу отобразить выходные данные, показывающие общее количество персонала, отвечающего за проект, на основе stage_id и разбивки на project_name.

Что я пытался / пытался

SELECT
    B.employee_name,
    B.project_name,
    A.total 
FROM
    (
    SELECT
        COUNT( * ) AS total,
        services.NAME AS project_name,
        services.id AS service_id,
        users.id AS member_id,
        users.NAME AS member_name 
    FROM
        users
        LEFT JOIN projects ON users.id = projects.leader_id
        LEFT JOIN services ON projects.service_id = services.id 
    WHERE
        ( projects.service_id IN ( 1, 5 ) AND projects.stage_id < 6 ) 
        OR ( projects.service_id IN ( 2, 3, 4, 7 ) AND projects.stage_id < 7 ) 
    GROUP BY
        member_name,
        service_id 
    ) AS A
    RIGHT OUTER JOIN (
    SELECT
        users.id AS user_id,
        users.NAME AS employee_name,
        services.NAME AS project_name,
        services.id AS service_id 
    FROM
        users,
    services 
    ) AS B ON A.service_id = B.user_id RIGHT OUTER JOIN ( SELECT users.id AS user_id, users.NAME AS user_name, services.NAME AS project_name, services.id AS service_id FROM users, services ) AS B ON A.service_id = B.user_id

Я использовал этот запрос для генерации вывода ниже

+-------+-------------------+------------------+-------------------+
|   id  |   project_name    |   employee_name  |       total       |
+-------+-------------------+------------------+-------------------+
|   1   |   Projects A      |   Employee A     |         2         |
|   2   |   Projects B      |   Employee A     |         2         |
|   3   |   Projects A      |   Employee B     |         3         |
|   4   |   Projects B      |   Employee B     |         3         |
|   5   |   Projects A      |   Employee C     |         1         |
|   6   |   Projects B      |   Employee C     |         1         |
|   7   |   Projects A      |   Employee D     |         2         |
|   8   |   Projects B      |   Employee D     |         2         |
+-------+-------------------+------------------+-------------------+

Общее количество присваивается в неправильном ряду записи.

3. SQL Fiddle

Это пример вывода, который я создал на SQL Fiddle. http://www.sqlfiddle.com/#!9/08eff4/1/0

4. Ожидаемый результат

Я ожидаю, что общее количество может быть назначено для правильной строки записи.

Выходное ожидание

+-------+-------------------+------------------+-------------------+
|   id  |   project_name    |   employee_name  |       total       | (COUNT (*) AS total) 
+-------+-------------------+------------------+-------------------+
|   1   |   Projects A      |   Employee A     |         2         |
|   2   |   Projects B      |   Employee A     |        NULL       |
|   3   |   Projects A      |   Employee B     |         3         |
|   4   |   Projects B      |   Employee B     |        NULL       |
|   5   |   Projects A      |   Employee C     |         1         |
|   6   |   Projects B      |   Employee C     |        NULL       |
|   7   |   Projects A      |   Employee D     |         2         |
|   8   |   Projects B      |   Employee D     |        NULL       |
+-------+-------------------+------------------+-------------------+

У меня заканчиваются идеи для достижения ожидаемого результата. Поэтому я хотел бы обратиться за помощью к экспертам на этом форуме.

1 Ответ

0 голосов
/ 08 мая 2019

P / S: имя поля может отличаться от приведенного выше, потому что я пишу запрос в другой схеме

Мне удалось найти ответ после попытки продолжить.

SELECT
    A.NAME,
    B.NAME,
    (
    SELECT
        COUNT( * ) 
    FROM
        projects
        LEFT JOIN users ON users.id = projects.leader_id 
    WHERE
        (
            projects.service_id IN ( 1, 5 ) 
            AND projects.stage_id < 6 
            AND users.id = A.id 
            AND projects.service_id = B.id 
        ) 
        OR (
            projects.service_id IN ( 2, 3, 4, 7 ) 
            AND projects.stage_id < 7 
            AND users.id = A.id 
            AND projects.service_id = B.id 
        ) 
    ) 
FROM
    users AS A
    CROSS JOIN services AS B

Это запрос, который выдает мой ожидаемый результат, как показано ниже.

+-------+-------------------+------------------+-------------------+
|   id  |   project_name    |   employee_name  |       total       | (COUNT (*) AS total) 
+-------+-------------------+------------------+-------------------+
|   1   |   Projects A      |   Employee A     |         2         |
|   2   |   Projects B      |   Employee A     |        NULL       |
|   3   |   Projects A      |   Employee B     |         3         |
|   4   |   Projects B      |   Employee B     |        NULL       |
|   5   |   Projects A      |   Employee C     |         1         |
|   6   |   Projects B      |   Employee C     |        NULL       |
|   7   |   Projects A      |   Employee D     |         2         |
|   8   |   Projects B      |   Employee D     |        NULL       |
+-------+-------------------+------------------+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...