2 votes

Comment joindre des tableaux et les afficher même s'il n'y a pas de lignes dans le tableau 2 ?

J'ai 2 tables, une avec les utilisateurs et une autre avec les transactions. J'essaie d'afficher tous les utilisateurs avec la somme de leurs transactions.

L'instruction ci-dessous s'affiche correctement, sauf qu'elle n'inclut que les utilisateurs qui ont des transactions. Comment puis-je lister tous les utilisateurs et, s'il n'y a pas de transaction, afficher la somme à 0 ?

Voici la déclaration que j'utilise :

SELECT 
    user.ID, user.FirstName, user.LastName, 
    user.Username, 
    SUM(transaction.Amount) As Total
FROM    user 
    LEFT JOIN transaction 
        ON user.ID = transaction.runnerID
WHERE user.event = 'EventX' 
    AND user.Active = 'True' 
    AND (user.tran_result = '1' OR user.tran_result ='manual' )  
    AND transaction.event = 'EventX' 
    AND (transaction.tran_result = '1' OR transaction.tran_result ='manual' )
GROUP BY user.ID
ORDER BY user.LastName ASC 

Je suppose que c'est l'instruction WHERE qui supprime ces lignes, mais si je supprime l'instruction WHERE et que je place ces détails dans le LEFT JOIN, il semble que la tentative d'obtenir des résultats se bloque. (Il y a environ 2 000 utilisateurs et 40 000 transactions).

Merci !

3voto

a_horse_with_no_name Points 100769

Vous devez déplacer les critères de la table de transaction dans la condition JOIN. En le plaçant dans la clause WHERE, votre jointure externe devient une jointure interne :

SELECT ....
FROM user
LEFT JOIN transaction 
    ON user.ID = transaction.runnerID 
       AND transaction.event = 'EventX' 
       AND (transaction.tran_result = '1' OR transaction.tran_result ='manual' )
WHERE user.event = 'EventX' 
  AND user.Active = 'True' 
  AND (user.tran_result = '1' OR  user.tran_result ='manual' )
GROUP BY user.ID
ORDER BY user.LastName ASC

0voto

James P. Wright Points 3062

0voto

Paul Williams Points 7390

Avez-vous essayé de changer SUM(transaction.Amount) a SUM(ISNULL(transaction.Amount, 0)) ? Cela permettra de s'assurer qu'une valeur NULL (c'est-à-dire qu'aucune transaction ne correspond) est traitée comme 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X