2009-05-19 42 views
4

我有这个疑问:我怎样才能得到这个查询返回0而不是null?

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

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

例如,事务表有3行用于鲍勃,2行用于约翰,没有用于珍妮。我希望它返回bob和john的总和,并且为jane返回0。 (或者如果没有其他方式,可能为空)

我该怎么做?

表是这样的:

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

在我的回答中重写了查询,我误解了你的要求。 – 2009-05-19 18:36:06

回答

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()重写了查询,我认为这是您最初失踪的关键。如果您只从交易表中进行选择,则无法在表中获取有关而不是的信息。但是,通过使用租户表中的左连接,您应该为每个现有租户获得一行。

+0

我更新了标签,它是SQL Server Express 2005的tsql – Malfist 2009-05-19 17:49:10

+0

coalesce适用于SQL Server以及 – catalpa 2009-05-19 17:50:30

+0

我不知道这是否有效,因为我找到了自己的解决方案,但我假设它会和社区似乎喜欢所以我选择它作为答案。 – Malfist 2009-05-19 17:53:29

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 

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

-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 
0
SELECT (SUM(ISNULL(tblTransaction.AmountPaid, 0)) 
     - SUM(ISNULL(tblTransaction.AmountCharged, 0))) AS TenantBalance 
     , tblTransaction.TenantID 
     FROM tblTransaction 
     GROUP BY tblTransaction.TenantID 

我只加这一点,因为如果你的目的是考虑到对零件是空的一个,你需要做的ISNULL分别为

1

下面是对问题的全面介绍。函数isnull也包含在内,以确保没有事务的Tenants返回零(而不是空)的余额。

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; 
相关问题