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
最后就可以得到想要的结果。

浙公网安备 33010602011771号