Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不选择零的值求和_Sql - Fatal编程技术网

Sql 不选择零的值求和

Sql 不选择零的值求和,sql,Sql,我有两张桌子,一张是CDmachine,一张是TRNAACTION 包含列CDMachineID、CDMachineName、InstallationDate的CDMachine表 列为TransactionID、CDMachineID、TransactionTime、Amount的事务表 我使用下面的查询计算收入,但它消除了没有任何交易的机器 SELECT CDMachine.MachineName, SUM(Transaction.Amount) FROM CDMachine

我有两张桌子,一张是CDmachine,一张是TRNAACTION

包含列CDMachineID、CDMachineName、InstallationDate的CDMachine表

列为TransactionID、CDMachineID、TransactionTime、Amount的事务表

我使用下面的查询计算收入,但它消除了没有任何交易的机器

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

这对我很有帮助。非常感谢,戴夫。