我有2个表,1个用户,另一个用于交易。我试图用他们的交易总和显示所有用户。
以下声明正确显示,但它只包含有交易的用户。如何列出所有用户,如果没有交易,则应将总和显示为0?
以下是我正在使用的声明:
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
我假设它是正在删除这些行的WHERE语句,但是如果我删除WHERE语句并将这些细节作为LEFT JOIN的一部分放置,它似乎只是挂起试图获得结果。 (大约有2,000个用户和40,000个交易)
谢谢!
答案 0 :(得分:3)
您需要将事务表的条件移动到JOIN条件。将它放入WHERE子句有效地将外连接转换为内连接:
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
答案 1 :(得分:0)
答案 2 :(得分:0)
您是否尝试将SUM(transaction.Amount)
更改为SUM(ISNULL(transaction.Amount, 0))
?这将确保将NULL值(即没有匹配的事务)视为0。