2010-01-05 27 views
1

組,我將嘗試儘可能地對此進行解釋,我希望它能使(某些)有意義。我從我創建的視圖中提取數據,告訴我「贊助商」的客戶類型以及客戶類型中的多少個帳戶在1年,2年和3年後處於非活動狀態。例如:爲非現有值強制賦值爲0

SponsorID | CustomerType | ExpiredAfter | Total 
1234  D    1 Year   5 
1234  RA    1 Year   7 
1234  CA    1 Year   3 
1234  D    2 Years  2 
1234  RA    2 Years  4 
1234  CA    2 Years  1 
1234  D    3 Years  8 
1234  RA    3 Years  1 
1234  CA    3 Years  6 

我遇到的問題是一個SponsorID可能不具有ExpiredAfter 1年,所以沒有在數據顯示的任何RA。因此,而不是越來越:

SponsorID | CustomerType | ExpiredAfter | Total 
1235  D    1 Year   5 
1235  RA    1 Year   0 
1235  CA    1 Year   3 

我得到:

SponsorID | CustomerType | ExpiredAfter | Total 
1235  D    1 Year   5 
1235  CA    1 Year   3 

同樣,不知道是否有任何這使得任何意義,但我想要做的是包括所有類型的客戶對所有ExpiredAfter不管有價值與否。如果沒有值,我只是想強制一個0或Null。出於報告目的,我需要這個數據行爲0。

有什麼建議嗎?

+1

左外連接,也許? – 2010-01-05 15:21:38

回答

8

聽起來你需要使用LEFT JOIN而不是INNER JOIN

+0

LEFT JOIN將*只*確保空值對於支持沒有值的行可見。見'timmyd'的答案。 – 2010-01-05 15:44:13

+0

只要行存在,OP表示「0」或「NULL」都可以工作。我相信'LEFT JOIN'仍然可以解決這個問題,但看起來我們都在這裏暗暗刺骨,卻沒有看到相關的疑問。 – pix0r 2010-01-05 17:13:25

6

您可能還需要使用ISNULL(總數爲0)或COALESCE(總數爲0),具體取決於您使用的是哪個DBMS,以及您的查詢(如womp所述)......因爲如果計算TOTAL,則從一個LEFT JOIN中得到一個空值將仍然讓你沒有0值。

+0

+1:用於回答OP的問題。 COALESCE是ANSI標準,否則NULL檢查函數在dbs之間是不同的。 IE:NVL for Oracle,IFNULL for MySQL,ISNULL是SQL Server ... – 2010-01-05 15:45:51