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

2014-11-24 16:26:37 · 作者: · 浏览: 1
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

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