统计出来的结果:

我想要的结果

我要做一个统计,统计每年每个月每个地区的各个产品的销量,如果有些月份某个地区的型号的产品没有销量,就显示一条该地区的该产品为0的记录。统计出来的结果要无论该产品是否有销量,每个地区的每种型号都必须出现在每个月。
sql2005 sql查询语句
------解决方案--------------------
是这样的效果吗:
WITH CTE (Area,YearMonth,Type1,Type2,Type3)
AS (
SELECT N'长沙市', '200608',null,null,2 UNION ALL
SELECT N'上海', '200608',1, 7,10 UNION ALL
SELECT N'北京', '200608',1,null,null UNION ALL
SELECT N'广州', '200608',null,null,2 UNION ALL
SELECT N'长沙市', '200609',null,null,1 UNION ALL
SELECT N'上海', '200609',null,null,8 UNION ALL
SELECT N'北京', '200609',null, 1,15 UNION ALL
SELECT N'广州', '200609',1,null,null UNION ALL
SELECT N'上海', '200610',null,null,1 UNION ALL
SELECT N'广州', '200610',null,null,null UNION ALL
SELECT N'长沙市', '200611',null,null,null UNION ALL
SELECT N'广州', '200612',1,null,4
),
t
as
(
select a.area,
b.yearmonth
from (select distinct area from cte) a
cross join (select distinct yearmonth from cte)b
)
SELECT t.Area
,SUBSTRING(t.YearMonth,1,4) [YEAR],
SUBSTRING(t.YearMonth,5,2)[month],
t.yearmonth
,ISNULL(SUM(c.Type1),0) AS Type1
,ISNULL(SUM(c.Type2),0) AS Type2
,ISNULL(SUM(c.Type3),0) AS Type3
FROM t
left join CTE c
on t.area = c.area
and t.yearmonth = c.yearmonth
GROUP BY t.Area,
t.YearMonth
ORDER BY t.YearMonth,t.Area
/*
Area YEAR month yearmonth Type1 Type2 Type3
北京 2006 08 200608 1 0 0
长沙市 2006 08 200608 0 0 2
广州 2006 08 200608 0 0 2
上海 2006 08 200608 1 7 10
北京 2006 09 200609 0 1 15
长沙市 2006 09 200609 0 0 1
广州 2006 09 200609 1 0 0
上海 2006 09 200609 0 0 8
北京 2006 10 200610 0 0 0
长沙市 2006 10 200610 0 0 0
广州 2006 10 200610 0 0 0
上海 2006 10 200610 0 0 1
北京 2006 11 200611 0 0 0
长沙市 2006 11 200611 0 0 0
广州 2006 11 200611 0 0 0
上海 2006 11 200611 0 0 0
北京 2006 12 200612 0 0 0
长沙市 2006 12 200612 0 0 0
广州 2006 12 200612 1 0 4
上海 2006 12 200612 0 0 0
*/
------解决方案--------------------
应该还有一个表,存放所有的地区,用这个表左连接你的销量的这个表,就可以了。