Sql 不选择零的值求和
我有两张桌子,一张是CDmachine,一张是TRNAACTION 包含列CDMachineID、CDMachineName、InstallationDate的CDMachine表 列为TransactionID、CDMachineID、TransactionTime、Amount的事务表 我使用下面的查询计算收入,但它消除了没有任何交易的机器Sql 不选择零的值求和,sql,Sql,我有两张桌子,一张是CDmachine,一张是TRNAACTION 包含列CDMachineID、CDMachineName、InstallationDate的CDMachine表 列为TransactionID、CDMachineID、TransactionTime、Amount的事务表 我使用下面的查询计算收入,但它消除了没有任何交易的机器 SELECT CDMachine.MachineName, SUM(Transaction.Amount) FROM CDMachine
SELECT CDMachine.MachineName,
SUM(Transaction.Amount)
FROM CDMachine
LEFT JOIN TRANSACTION ON CDMachine.CDMachineID = Transaction.CDMachineID
WHERE Transaction.TransactionTime BETWEEN '2019-01-01' AND '2019-01-31'
GROUP BY CDMachine.CDMachineName
ORDER BY 2
将
WHERE
条件移动到ON
子句:
select m.MachineName, sum(t.Amount)
from CDMachine m left join
Transaction t
on m.CDMachineID = t.CDMachineID and
t.TransactionTime between '2019-01-01' and '2019-01-31'
group by m.CDMachineName
order by 2;
WHERE
子句将外部联接转换为内部联接——这意味着您将丢失不匹配的值
如果希望总和为0
而不是NULL
,则使用:
select m.MachineName, coalesce(sum(t.Amount), 0)
即使您使用的是左联接,但在联接表的列上有一个筛选器这一事实也会导致从结果集中删除不符合联接条件的行 您需要在加入事务表之前或作为加入条件的一部分,将事务时间过滤器应用于事务表。我会这样做:
SELECT CDMachine.MachineName,
SUM(Transaction.Amount)
FROM CDMachine
LEFT JOIN (
SELECT * FROM TRANSACTION
WHERE Transaction.TransactionTime BETWEEN '2019-01-01' AND '2019-01-31'
) AS Transaction
ON CDMachine.CDMachineID = Transaction.CDMachineID
GROUP BY CDMachine.CDMachineName
ORDER BY 2
这对我很有帮助。非常感谢,戴夫。