0
votes

La sous-requête renvoie plus d'une ligne lorsque l'agrégation est utilisée

La sous-requête renvoie plus d'une ligne ??

╦══════════════╦══════════════╦
â•‘ user_id      â•‘ profit left  â•‘ 
╠══════════════╬══════════════╬
â•‘ 1            â•‘    100       â•‘  
â•‘ 1            â•‘    30        â•‘  
â•‘ 2            â•‘     70       â•‘  
â•‘ 2            â•‘     20       â•‘  
╚══════════════╩══════════════╩
╔════╦══════════════╦════════════╦════════════╦
â•‘ 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       â•‘
╚════╩══════════════╩════════════╩════════════╩

et le tableau ci-dessous est ce que je veux réaliser

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

c'est pourquoi je pensais avoir besoin utiliser group by pour distinguer user_id

J'ai déjà regardé

La sous-requête renvoie plus d'une ligne - MySQL

renvoie plus d'une ligne?

mais ne comprend toujours pas.

En joignant deux tables différentes, j'obtiens le tableau ci-dessous .

Quelqu'un peut-il m'aider à résoudre le problème?


0 commentaires

3 Réponses :


0
votes

Je pense que vous voulez une sous-requête corrélée. Je ne suis pas sûr de ce que vous faites vraiment, mais cela devrait corriger votre erreur:

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

Vous voudrez peut-être plutôt cela par service. Mais le fait est que l'agrégation n'est pas appropriée pour la sous-requête. Une clause de corrélation est appropriée.


1 commentaires

désolé de vous avoir confus. J'ai dessiné le tableau pour une meilleure compréhension



1
votes

Modifier: en fonction de la structure de la table et de la sortie requise, j'ai mis à jour la requête et supprimé where et jointure gauche indésirables.

Je ne sais pas ce que vous ' essayez de faire. Mais d'après ce que j'ai compris, j'ai corrigé votre requête:

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


2 commentaires

Merci pour votre avis. J'ai ajouté des tableaux pour une meilleure compréhension. pensez-vous que je peux toujours utiliser group_by?


Il semble que votre demande était assez simple. Vous n'avez pas besoin de where ou ayant clause et jointure gauche . J'ai mis à jour ma requête. Vous devez afficher employee_department dans la sortie, car c'est ainsi que votre profit est divisé, c'est-à-dire employé et service.



0
votes

Votre sous-requête regroupant tous les employés de la table de l'entreprise et non l'un d'entre eux. Vous devez mettre la condition where dans la sous-requête pour filtrer les enregistrements et pas besoin de regrouper en sous-requête.


1 commentaires

merci pour ton idée. J'ai ajouté des tableaux pour vous aider à comprendre. dans ce cas, dois-je encore mettre la condition où?