sql查询统计,根据新闻类别ID统计,没有数据显示0

有两张表,新闻信息表MessageInfo和新闻类别表MessageType。表结构如下:

然后需要实现下面这种查询结果:

这个是我面试时遇到的,上面的新闻类型是乱写的。当时没有做出来,然后回来又研究了下。

刚开始是这么想的,新闻类型表MessageType左连接left join新闻信息表MessageInfo,筛除那些新闻ID为空的,然后根据新闻类型名直接分组统计。

1 select MessageName as '新闻类型',COUNT(*) as '新闻数量' from MessageType left join MessageInfo
2 on MessageType.MessageTypeId=MessageInfo.MessageTypeId where MessageId is not null
3 group by MessageName

出现了这种结果:

原因是执行group by之前,已经先执行where条件筛选了。当时脑袋就一直被绕进这两个先后顺序的弯里,出不来。百度了好久,都没有结果,最后还是询问了几个同学才搞出来。

思路是这样的,先对通过新闻类型ID对新闻信息表MessageInfo进行统计分组,返回一个包含新闻类型ID和新闻数量的新集合,然后左连接到新闻类型表MessageType中。这个时候就基本上完成了。那些没有新闻类型下没有新闻信息的左连接后就是null,最后我们把null用isnull()函数替换成0就可以。sql语句如下:

1 select a.MessageName as '新闻类型',isnull(b.count,0) as '新闻数量' from MessageType as a
2 left join(
3 select MessageTypeId,count(1) as [count] from MessageInfo group by MessageTypeId) as b 
4 on a.MessageTypeId=b.MessageTypeId

最后就可以得到想要的结果。

posted @ 2013-08-12 22:50  导演那盒饭  阅读(2429)  评论(1)    收藏  举报