2014-12-04 132 views
1

是的,這裏一定有幾十個類似的問題,我嘗試了20或30個排列組合,但我仍然難倒了。這是最簡單的減少:sql count/group by/zero

select MyMethodNbr, count(*) from MyDB 
where MyMethodNbr in (33, 57, 150, 160, 200, 240) 
group by MyMethodNbr 
order by MyMethodNbr ASC 

在MyMethodNbr列表中的某些項目不存在於表中,但我想給空轉換成零。我只能得到一個非零計數的表格。

+0

哪dbms oracle或mysql或sql server?如果33不存在,你是否希望零這個值? – radar 2014-12-04 02:57:26

+0

MS SQL。是的,如果33不存在,我想要一個零計數。這就是問題所在...... – 2014-12-04 03:29:51

回答

1

您可以使用left join來執行此操作。這裏是典型的語法:

select n.n as MyMethodNbr, count(MyDB.MyMethodNbr) as num 
from (select 33 as n union all select 57 union all select 150 union all select 160 union all 
     select 200 union all select 240 
    ) n left join 
    MyDB 
    on MyDB.MyMethodNbr = n.n 
group by n.n 
order by num ASC; 

在一些數據庫中,你將需要from dual或類似的結構,以創建號碼列表。

+0

嗯......如果我的清單是100個項目呢?這看起來有點笨重。在我的原始版本中,我使用了包含「IN」列表中所有項目的另一個表格的左連接,但也包含了其他我不感興趣的項目。 – 2014-12-04 03:23:44

+0

@nas。 。 。您需要以某種方式生成列表。 Excel可能對此有用。或者,如果列表基於另一個查詢,則使用該查詢。 – 2014-12-04 03:32:31

-1
select ISNULL(MyMethodNbr,0), count(*) from MyDB 
where MyMethodNbr in (33, 57, 150, 160, 200, 240) 
group by MyMethodNbr 
order by MyMethodNbr ASC