2014-12-04 150 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