2012-03-26 90 views
3

下面是測試表中的示例數據我有計數空值在SQL與其中和基團通過子句

[childId] [parentId] [present] 
1   10   0 
2   11   1 
3   NULL  0 
4   NULL  0 
NULL  10   0 

現在,對於所有的parentIds(包括那些具有NULL)我要計數的所有本childIds

select parentId, count(childId) as nbr 
from TestTable 
where present=1 or parentId is NULL 
group by parentId 

結果我得到的是

parentId nbr 
NULL  2 
11   1 

同樣的計數次數(nbr)我得到當前= 1和當前= 0。看來我不能爲NULL分組值賦予一個條件。
我在做什麼錯誤以及我想要做什麼解決方案?


UPDATE

由於測試情況下,我給了不具代表性,直到我重新創建更好的辦法的實際情況,我會盡力解釋我所面臨的問題。

我創建了一個全外連接的視圖,所以我有一些NULLchildId的記錄,有些記錄爲parentIdNULL
現在,我想列出所有parentId值(包括NULL和非NULL),併爲它們中的每一個計數所有記錄,例如,具有present=1。 如果我使用where present=1條件,它將從結果集中消除NULL值,即對於parentId|nbr,我將不會得到結果記錄NULL|x
我用union all解決了這個問題。在第一選擇我有where present=1和第二選擇我有where present=1 and parentId is NULL

select parentId, count(childId) as nbr 
from TestTable 
where present=0 
group by parentId 

union all 

select parentId, count(childId) as nbr 
from TestTable 
where present=0 and parentId is NULL 
group by parentId 

結果我得到的是

[parentId] [nbr] 
    NULL  2 
    10   1 
    NULL  2 

這個唯一的問題(除了爲parentId=NULL複製的記錄),就是如果有與parentId=NULLpresent=1沒有記載,因此我不會有記錄NULL | 0parentId|nbr,我想列出所有parentIds,NULL而不是NULL
所以總結起來,我需要有輸出的格式爲present=1

[parentId] [nbr] 
    NULL  0 
    10   0 
    11   1 

和這一個present=0

[parentId] [nbr] 
    NULL  2 
    10   2 
    11   0 

任何幫助嗎?

+0

,如果你只是跳過看是空的,並且說'SELECT parentid,COUNT(*)AS nbr FROM TestTable WHERE present = 1 GROUP BY parentid',結果與你想要的有什麼不同? – 2012-03-26 11:49:22

+0

我試圖模擬這個測試樣本的真實情況,但現在我發現我沒有給出正確的示例和測試數據。 – 2012-03-26 11:51:05

+0

如果你想顯示NULL Parent,並顯示它們有0或1,你只需將當前列添加到你的組中。查看我的更新回答 – cairnz 2012-03-27 11:18:18

回答

3
where present=1 or parentId is NULL 

就是這樣。要麼你有= 1或parentID爲空。有沒有條款說parentID應該爲空禮物應該是1.

你究竟想要完成什麼?

要列出所有存在= 1且全爲空的parentID(不管存在)的所有非空parentID,可以使用where子句,但編輯組的時候可以編輯GROUP BY parentid, present。這樣,您將顯示所有非null與當前1和全爲空,都出現0和1.

更新: 根據您的新要求,您還需要組爲不存在的組合。在你的數據集中沒有任何地方存在一個NULL,1的值 - 所以你看它的普通方式沒有多大意義。你需要分開parentid和來自彼此的禮物。要做到這一點

一種方法是簡單地做到以下幾點:

SELECT parentID, Pres1.nbr_pres_1, Pres0.nbr_pres_0 
FROM t 
OUTER APPLY (SELECT COUNT(1) as nbr_pres_1 FROM t t1 WHERE 
      coalesce(t.parentid , -999) = coalesce(t1.parentid ,-999) and present=1) Pres1 
OUTER APPLY (SELECT COUNT(1) as nbr_pres_0 FROM t t0 WHERE 
      coalesce(t.parentid , -999) = coalesce(t0.parentid ,-999) and present=0) Pres0 
GROUP BY t.ParentID, Pres1.nbr_pres_1, Pres0.nbr_pres_0 

這是基於使用sqlfiddle和您的樣本數據集測試。 http://sqlfiddle.com/#!3/8d7f6/29

+0

我想列出當前值爲1的所有非null parentIds和當前值爲1的全部爲null的parentId。我完成了這一切與工會。在第一個選擇中我有'where present = 1',在第二個選擇中我有'where present = 1且parentId是NULL'。唯一的問題是,如果沒有'parentId = NULL'和'present = 1'的記錄,結果我不會有'NULL | 0'代表'parentId | nbr',我想列出所有parentIds,NULL和not NULL。任何幫助? – 2012-03-27 14:02:16

0

如果這是你正在尋找的結果是:

pId nbr 
NULL 1 
10  0 
11  1 

那麼我認爲這是你正在尋找的SQL(尚未測試,沒有可用的服務器):

select distinct 
    parentId as pId, 
    (select count(*) from TestTable where parentId=pId and present=1) as nbr 
from TestTable 
group by parentId 
0

嘗試下面提到的代碼片段。

SELECT ParentId, COUNT(ChildId) nbr FROM SO 

凡(存在= 1)或(的ParentId IS NULL和存在= 1) 集團通過的ParentId

--OR你可以試試下面提及的代碼。

SELECT ParentId, COUNT(ChildId) nbr FROM SO 

其中本= 1 集團通過的ParentId

1

使用本領域的SUM聚合,鑄造位字段爲整數,如下所示:

SELECT parentId, SUM(CAST(present AS INTEGER)) as nbr 
FROM TestTable 
GROUP BY parentId