2012-12-02 54 views
1

我有三个表,我有领域 - area。所以我决定为每张桌子找一些区域并在一个视图中显示。显示NULL和值

我创建了一个查询

select sum(x.area) as EquipmentSpace,sum(y.area) as ProductSpace,sum(z.area) as ShoppointSpace 
from TEquipWarehouse as x,TProductWarehouse as y,TShopPoint as z 

然而,当一个表没有任何记录 - 每场的结果是NULL

如何解决这个问题?

select sum(ISNULL(x.area,0)) as EquipmentSpace,sum(ISNULL(y.area,0)) as ProductSpace,sum(ISNULL(z.area,0)) as ShoppointSpace 
from TEquipWarehouse as x,TProductWarehouse as y,TShopPoint as z 

在这种情况下,如果值不存在,你将其代0您SUM的目的:

回答

2

查询有几个问题。你基本上在做一个CROSS JOIN。因此,当一个表的行数为零时,不仅中间结果集中会有零行,而且当任何表中有多行时,也会有大量重复的数据。这将导致第一种情况为空结果,第二种情况为错误结果。

您的查询将按预期工作的唯一情况是当所有3个表格都恰好有一行时。

有你想要什么,你需要3个独立的子查询,然后将它们结合在一个:

SELECT 
    COALESCE((SELECT SUM(area) FROM TEquipWarehouse), 0 
      ) AS EquipmentSpace 
    , COALESCE((SELECT SUM(area) FROM TProductWarehouse), 0 
      ) AS ProductSpace, 
    , COALESCE((SELECT SUM(area) FROM TShopPoint), 0 
      ) AS ShoppointSpace 
; 

COALESCE() fubction被用来转换NULL为0,当表中没有行。

+2

这修复了原始示例的几个问题。行不会多次计数,并且缺少行的单个表对其他表没有影响。对于缺少行的单个表,您将得到空值。 – joshp

+0

我已经使用IsNull为每个子查询 – lapots

+1

当只有2个参数时,'ISNULL()'和'COALESCE()'做同样的事情,所以可以使用它。 COALESCE与超过2个参数一起工作(在您的查询中不需要)。 –

0

使用ISNULL到如果没有可用值代替的值。