2014-03-03 60 views
0

我正在運行SBS 2008與SQL Server 2008 R2顯示零代替空的值在SQL Server 2008 R2

MYOB EXONET SQL數據庫

我試圖找出我們最重要的客戶多少錢每月支出,但如果客戶沒有花費,下面的查詢不會返回零值,我想它不會給我一個零結果,因爲數據庫中沒有任何東西可以加起來,但是我仍然需要它來產生一個零結果,否則我無法找出哪些客戶沒有花費。

SELECT 
    DR.ACCNO, 
    SUM(Analytics_SaleInvoice.SalesValueTaxExclusive) 
FROM 
    DR_ACCS DR 
INNER JOIN 
    Analytics_SaleInvoice Analytics_SaleInvoice ON (Analytics_SaleInvoice.AccountNumberAnalysis = DR.ACCNO) 
WHERE 
    (DR.X_TOPCUSTOMER = 'Y') 
    AND (Analytics_SaleInvoice.AgePeriod = 5) 
GROUP BY 
    DR.ACCNO, DR.ACCNO,Analytics_SaleInvoice.AccountNumberAnalysis 

有沒有人有任何想法我可以得到零結果?

回答

0

你需要left outer join讓你得到所有客戶:

SELECT DR.ACCNO, 
     COALESCE(SUM(Analytics_SaleInvoice.SalesValueTaxExclusive), 0) as Total 
FROM DR_ACCS DR LEFT OUTER JOIN 
    Analytics_SaleInvoice Analytics_SaleInvoice 
    ON Analytics_SaleInvoice.AccountNumberAnalysis = DR.ACCNO AND 
     Analytics_SaleInvoice.AgePeriod = 5 
WHERE DR.X_TOPCUSTOMER = 'Y' 
GROUP BY DR.ACCNO, DR.ACCNO,Analytics_SaleInvoice.AccountNumberAnalysis 
ORDER BY COALESCE(SUM(Analytics_SaleInvoice.SalesValueTaxExclusive), 0) DESC; 

隨着left outer join,需要在第二個表的條件移動到on子句和coalesce()用於將NULL值轉換爲0

我還添加了一個order by,因爲您似乎首先想要最好的顧客。

+0

非常好,謝謝這個作品以及.. – user3371797

0

嘗試LEFT JOIN代替:

SELECT 
    DR.ACCNO, 
    ISNULL(SUM(Analytics_SaleInvoice.SalesValueTaxExclusive), 0) 
FROM DR_ACCS DR 
LEFT JOIN Analytics_SaleInvoice Analytics_SaleInvoice 
    ON (Analytics_SaleInvoice.AccountNumberAnalysis = DR.ACCNO) 
    AND (Analytics_SaleInvoice.AgePeriod = 5) 
WHERE (DR.X_TOPCUSTOMER = 'Y') 
GROUP BY DR.ACCNO, DR.ACCNO,Analytics_SaleInvoice.AccountNumberAnalysis 
+0

謝謝,這個工作,但它給出了一個空的,而不是零 – user3371797

+0

再次嘗試 - 我添加了一個'ISNULL'打開空值到0。 –

0

在DR_ACCS和Analytics_SalesInvoice之間使用LEFT JOIN而不是INNER JOIN。 LEFT JOIN保證至少爲DR_ACCS中的每個記錄返回一個結果。像這樣的東西應該工作:

SELECT DR.ACCNO, IsNull(SUM(Analytics_SaleInvoice.SalesValueTaxExclusive), 0) 
FROM DR_ACCS DR LEFT JOIN Analytics_SaleInvoice Analytics_SaleInvoice 
ON (Analytics_SaleInvoice.AccountNumberAnalysis = DR.ACCNO) 
WHERE (DR.X_TOPCUSTOMER = 'Y') 
AND ((Analytics_SaleInvoice.AgePeriod = 5) OR (Analytics_SalesInvoice.AgePeriod IS NULL)) 
GROUP BY DR.ACCNO, DR.ACCNO,Analytics_SaleInvoice.AccountNumberAnalysis 
+0

謝謝,這個查詢給我一個錯誤「多部分標識符」Analytics_SalesInvoice.AgePeriod「無法綁定。」它似乎是「OR(Analytics_SalesInvoice.AgePeriod IS NULL」這是問題。 – user3371797