2010-11-06 71 views
3

我有通話詳細記錄表。每行有UserIdUserBNumber計數(*)返回null

我也得到了有UserIdNumber的表,所以有數字我可以說什麼是用戶的ID。

因此,從每個CDR記錄我可以說什麼是一個誰打電話誰收到電話的ID。

有時候用戶調用其心不是我的用戶數據庫(電話網絡外)

現在數字我想有查詢,給了我UserAId(caller), UserBId(receiver), count(*)

,這樣我就知道之間的連接數用戶。

UserAId, UserBId, NumberOfConnections 

如果接收呼叫的號碼不在我的表中,則UserA呼叫網絡外的其他人。

我想有結果:

UserAId, NULL, NumberOfConnectionsOutsideTheNetwork 

這裏是我的查詢:

TableA: CDR Table 
TableB: User -> Number table 

select A.UserId, B.UserId, count(*) 
from select tableA A 
left outer join tableB B 
on A.UserBNumber = B.Number 
group by A.UserId, B.UserId 

問題是,我COUNT(*)有時會返回NULL。

我在做什麼錯了?

+4

您真正的查詢是什麼樣的?如果我沒有弄錯,那麼無論數據是什麼樣子,該查詢都不會返回一個空值來進行計數。其實我不能提出任何查詢的地方'count(*)'可以返回一個空值。 – Guffa 2010-11-06 23:48:54

+0

問題是我使用:插入到我的表中...上面的查詢結果。當我只使用select和group by ...具有COUNT(*)爲null時,它返回0行,但如果從我的問題中插入查詢結果,我有一條錯誤消息無法將NULL值插入到NumberOfConnections列 – gruber 2010-11-07 00:01:52

+0

我嘗試了插入一個帶有非空字段的表,從一個select中加入一個空表,並且我仍然沒有得到任何錯誤。我甚至沒有得到零值,從這樣的查詢返回的任何行都會有一個或多個計數。它會計算每個組中記錄的數量,並且不能有一個記錄爲零的組。 – Guffa 2010-11-07 00:30:25

回答

4

您的查詢在嘗試執行計數時正在執行外連接。如果B.UserId被列爲NULL,那麼count(*)也會返回NULL。您可以通過使用「count(A. *)」或通過將其包裝在ISNULL()中顯式執行A的計數來解決此問題。

select A.UserId, B.UserId, count(A.*) 
    from select tableA A 
    left outer join tableB B 
    on A.UserBNumber = B.Number 
group by A.UserId, B.UserId 

select A.UserId, B.UserId, isnull(count(*),0) 
    from select tableA A 
    left outer join tableB B 
    on A.UserBNumber = B.Number 
group by A.UserId, B.UserId 
+2

f B.UserId被列爲NULL,那麼count(*)也會返回NULL,這是不正確的 – gruber 2010-11-07 10:51:03

1
select A.UserId, COALESCE(B.UserId,'NumberOfConnectionsOutsideTheNetwork') AS UserId_B, count(*) 
from select tableA A 
left outer join tableB B 
on A.UserBNumber = B.Number 
group by A.UserId, COALESCE(B.UserId,'NumberOfConnectionsOutsideTheNetwork') 

試一下 - 你永遠不會用這種方式對空值進行分組。

+1

但它不是空組上的問題... – Guffa 2010-11-07 00:36:50

0

爲那個問題好遺憾。我也有ID列沒有(不知道爲什麼我確定我設置此:)沒有設置爲標識ON。

然後查詢插入第一個值作爲ID。

問題已解決,我無法想象count(*)可以返回NULL