2012-12-02 94 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到如果沒有可用值代替的值。