日期:2014-05-17  浏览次数:20921 次

关于sql统计分组时如何将未统计到的列显示为0
先说一下执行的语句:
select m_date, m_type, count(1) num from mytest group by m_type, m_date

然后执行语句后得到的结果:       
2013-09-01 宝马 1
2013-09-01 大众 4
2013-10-01 宝马 5
2013-10-01 奔驰 4
2013-10-01 大众 2

但是我想得到的结果是这样的
2013-09-01 宝马 1
2013-09-01 大众 4
2013-09-01 奔驰 0
2013-10-01 宝马 5
2013-10-01 奔驰 4
2013-10-01 大众 2

其中蓝色显示的是分组统计中不会出现的列,
我想问的是如何在仅使用SQL语句的情况下得到这样的结果?
同时又不会对查询效率有很大的影响

上述这样的问题困扰了我N长的时间都无法解决,期间问了不少人,都得不到满意的结果,最后有位高手写出了我想要的那种结果,但是效率实在是太低了!
因为做统计的时候非常需要这样的结果(在程序中实现因为有太多的变数,所以很不好做)

于是便到这里恳请各位高手可以帮忙解决一下,小弟万分感激!!!

最后附上模拟的建表和一些数据:
create TABLE mytest
(
m_id [int] IDENTITY(1,1) primary key,
m_type varchar(50),
m_date varchar(10)
)

insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('宝马','2013-10-01');
insert into mytest(m_type, m_date) values ('宝马','2013-10-01');
insert into mytest(m_type, m_date) values ('宝马','2013-10-01');
insert into mytest(m_type, m_date) values ('宝马','2013-10-01');
insert into mytest(m_type, m_date) values ('宝马','2013-10-01');
insert into mytest(m_type, m_date) values ('大众','2013-10-01');
insert into mytest(m_type, m_date) values ('大众','2013-10-01');
insert into mytest(m_type, m_date) values ('大众','2013-09-01');
insert into mytest(m_type, m_date) values ('大众','2013-09-01');
insert into mytest(m_type, m_date) values ('大众','2013-09-01');
insert into mytest(m_type, m_date) values ('宝马','2013-09-01');
insert into mytest(m_type, m_date) values ('大众','2013-09-01');



------解决方案--------------------
你是要这样的效果?
use tempdb
go
if object_id('mytest') is not null drop table mytest
go
create TABLE mytest
(
m_id [int] IDENTITY(1,1) primary key,
m_type varchar(50),
m_date varchar(10)
)

insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('奔驰','2013-10-01');
insert into mytest(m_type, m_date) values ('宝马','2013-10-01');
insert into mytest(m_type,&nb