如何让此查询返回0而不是null?

时间:2009-05-19 17:45:06

标签: sql-server tsql

我有这个问题:

SELECT (SUM(tblTransaction.AmountPaid) - SUM(tblTransaction.AmountCharged)) AS TenantBalance, tblTransaction.TenantID
    FROM tblTransaction
    GROUP BY tblTransaction.TenantID

但它有问题;还有其他TenantID没有交易,我也希望得到这些。

例如,事务表有bob的3行,john的2行和jane的none。我希望它返回bob和john的总和并返回j为jane。 (如果没有别的办法,可能会为null)

我该怎么做?

表格是这样的:

Tenants  
  ID  
  Other Data  
Transactions  
  ID  
  TenantID (fk to Tenants)
  Other Data  

5 个答案:

答案 0 :(得分:14)

(你没有陈述你的sql引擎,所以我要链接到MySQL文档。)

这几乎就是COALESCE()函数的用途。您可以将其提供给列表,它将返回列表中的第一个非空值。您可以在查询中使用它,如下所示:

SELECT COALESCE((SUM(tr.AmountPaid) - SUM(tr.AmountCharged)), 0) AS TenantBalance, te.ID
FROM tblTenant AS te
    LEFT JOIN tblTransaction AS tr ON (tr.TenantID = te.ID)
GROUP BY te.ID;

这样,如果SUM()结果为NULL,则将其替换为零。

已编辑:我使用LEFT JOIN和COALESCE()重写了查询,我认为这是您最初缺少的关键。如果您只从“交易”表中进行选择,则无法获得有关表格中的信息。但是,通过使用Tenants表中的左连接,您应该为每个现有租户获取一行。

答案 1 :(得分:1)

以下是该问题的完整演练。还包括函数isnull,以确保为没有交易的租户返回零(而不是空)的余额。

create table tblTenant
(
    ID int identity(1,1) primary key not null,
    Name varchar(100)
);

create table tblTransaction
(
    ID  int identity(1,1) primary key not null,
    tblTenantID int,
    AmountPaid  money,
    AmountCharged money
);

insert into tblTenant(Name)
select 'bob' union all select 'Jane' union all select 'john';

insert into tblTransaction(tblTenantID,AmountPaid, AmountCharged)
select 1,5.00,10.00
union all
select 1,10.00,10.00
union all
select 1,10.00,10.00
union all
select 2,10.00,15.00
union all 
select 2,15.00,15.00


select * from tblTenant
select * from tblTransaction

SELECT 
    tenant.ID, 
    tenant.Name,
    isnull(SUM(Trans.AmountPaid) - SUM(Trans.AmountCharged),0) AS Balance 
FROM tblTenant tenant
    LEFT JOIN tblTransaction Trans ON 
        tenant.ID = Trans.tblTenantID
GROUP BY tenant.ID, tenant.Name;

drop table tblTenant;
drop table tblTransaction;

答案 2 :(得分:0)

Select Tenants.ID, ISNULL((SUM(tblTransaction.AmountPaid) - SUM(tblTransaction.AmountCharged)), 0) AS TenantBalance
From Tenants 
Left Outer Join Transactions Tenants.ID = Transactions.TenantID
Group By Tenents.ID

我没有语法检查它,但它足够接近。

答案 3 :(得分:0)

SELECT (SUM(ISNULL(tblTransaction.AmountPaid, 0)) 
        - SUM(ISNULL(tblTransaction.AmountCharged, 0))) AS TenantBalance
       , tblTransaction.TenantID
        FROM tblTransaction
        GROUP BY tblTransaction.TenantID

我只是添加了这个,因为如果您打算考虑其中一个部分为null,则需要单独执行ISNULL

答案 4 :(得分:-1)

实际上,我找到了答案:

SELECT tenant.ID, ISNULL(SUM(trans.AmountPaid) - SUM(trans.AmountCharged),0) AS Balance FROM tblTenant tenant
LEFT JOIN tblTransaction trans
ON tenant.ID = trans.TenantID
GROUP BY tenant.ID