Подзапрос возвращает более 1 строки при использовании агрегации - PullRequest
0 голосов
/ 16 марта 2020

Подзапрос возвращает более 1 строки

SELECT
    `employee`.`employee_id` AS `employee_id`,
    (
    SELECT
        SUM(company.company_profit_left)
    FROM
        company
    GROUP BY
        company.employee_id,
        company.employee_department
) AS profit_left
FROM
    employee
LEFT JOIN `company` ON `company`.`employee_id` = `employee`.`employee_id`
GROUP BY
    `employee`.`employee_id`
HAVING
    SUM(
        company.company_profit_left
    ) = 0
╔════╦══════════════╦════════════╦════════════╦
║ id ║ user_id      ║ profit left║ department ║
╠════╬══════════════╬════════════╬════════════╬
║  1 ║ 1            ║  100       ║    1       ║ 
║  2 ║ 2            ║   50       ║    1       ║ 
║  3 ║ 1            ║   30       ║    2       ║ 
║  4 ║ 2            ║   20       ║    1       ║
║  5 ║ 2            ║   20       ║    3       ║
╚════╩══════════════╩════════════╩════════════╩

и таблица ниже - это то, чего я хочу достичь

╦══════════════╦══════════════╦
║ user_id      ║ profit left  ║ 
╠══════════════╬══════════════╬
║ 1            ║    100       ║  
║ 1            ║    30        ║  
║ 2            ║     70       ║  
║ 2            ║     20       ║  
╚══════════════╩══════════════╩

, поэтому я подумал, что мне нужно использовать group by для различения guish user_id

Я уже просмотрел

Подзапрос возвращает более 1 строки - MySQL

Подзапрос возвращает более 1 строки?

но все еще не понимаю.

Соединяя две разные таблицы, я получаю таблицу ниже.

кто-нибудь может помочь мне решить проблему?

Ответы [ 3 ]

1 голос
/ 16 марта 2020

Редактировать: на основе структуры таблицы и требуемого вывода я обновил запрос и удалил ненужные where и left join.

Я не знаю, что вы пытаетесь сделать. Но, исходя из моего понимания, я исправил ваш запрос:

SELECT
    employee.employee_id AS employee_id,
    profit_left.employee_department
    profit_left.company_profit
FROM
employee
JOIN (
    SELECT
        company.employee_id,
        company.employee_department,
        SUM(company.company_profit_left) as company_profit
    FROM company
    GROUP BY company.employee_id,company.employee_department
) AS profit_left on employee.employee_id=profit_left.employee_id
0 голосов
/ 16 марта 2020

Ваш подзапрос группирует всех сотрудников в табеле компании, а не один из них. Вы должны поставить условие where в подзапросе, чтобы отфильтровать записи, и нет необходимости группировать в подзапросе.

0 голосов
/ 16 марта 2020

Я думаю, что вы хотите коррелированный подзапрос. Я не уверен, что вы действительно делаете, но это должно исправить вашу ошибку:

(SELECT SUM(company.company_profit_left)
 FROM company c
 WHERE c.employee_id = e.employee_id
) AS profit_left

Возможно, вы захотите это по отделам. Но дело в том, что агрегация не подходит для подзапроса. Соответствующее предложение о корреляции.

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