可怕的统计汇总之一
create table tb_car_sale(
CarID varchar(20) primary key,
TypID int,
Color varchar(10),
SellDate datetime)
insert tb_car_sale select '1001 ',1, '皓白 ', '2007-1-9 '
union all select '1002 ',2, '银 ', '2007-7-30 '
union all select '1003 ',1, '皓白 ', '2007-4-13 '
union all select '1004 ',1, '皓白 ', '2007-9-21 '
union all select '1005 ',4, '碳黑 ', '2007-2-17 '
union all select '1006 ',4, '水晶蓝 ', '2007-3-29 '
union all select '1007 ',7, '水晶蓝 ', '2007-7-9 '
---要统计的车型
create table tb_stat_type(
TypID int primary key,
TypNam varchar(20))
insert tb_stat_type select 1, 'L4 '
union all select 2, 'L4+ '
union all select 3, 'GL3.5 '
union all select 4, 'GL2.5 '
--要统计的颜色
create table tb_stat_color(
ColorID int primary key,
ColorNam varchar(10))
insert tb_stat_color select 1, '白 '
union all select 2, '银 '
union all select 3, '黑 '
union all select 4, '蓝 '
说明:1、销车表(tb_car_sale)里的车型、颜色可以是tb_stat_type、tb_stat_color之外的车型和颜色
2、只统计tb_stat_type、tb_stat_color中要求的车型和颜色,其中颜色用like规则匹配,比如水晶蓝=蓝
3、要统计某一天(输入参数)所在星期及前3个星期(共4个星期)每个星期每款车型每种颜色的销售数量,期望结果如下:
比如是输入是2007-8-1,则结果为:
车型 w-3白 w-3银 w-3黑 w-3蓝 w-2白 w-2银 w-2黑 w-2蓝...合计
L4
L4+ 统计结果略
GL3.5
GL2.5
总计
(除了车型、合计以外,应该还有16列:4个星期和4种颜色的组合为16列;w-3表示3个星期前的星期,一直到w-0:本周)
4.可以稍微变通...但大概的结构不能变
------解决方案--------------------繁
帮你顶一下先
------解决方案--------------------仔细看了你的题目,没什么难的,标题到是吓人,
这里点一下,
1、group by生成三个结果集
2、行列转换
------解决方案-------------------- SELECT a.typNam,[w-0白],[w-0银],[w-0黑],[w-0蓝],[w-1白],[w-1银],[w-1黑],[w-1蓝],[w-2白],[w-2银],[w-2黑],[w-2蓝],[w-3白],[w-3银],[w-3黑],[w-3蓝],总计
FROM tb_stat_type a
left outer join (
SELECT typNam ,
Count(case when ColorID=1 then ColorID end )as N 'w-0白 ' ,
Count( case when ColorID=2 then ColorID end) as N 'w-0银 ' ,
Count( case when ColorID=3 then ColorID end) as N 'w-0黑 ' ,
Count( case when ColorID=4 then ColorID end) as N 'w-0蓝 '
FROM tb_car_sale inner join tb_stat_type on tb_car_sale.typID=tb_stat_type.TypID
inner join tb_stat_color on Color like ( '% '+ColorNam + '% ')
WHERE datediff(wk,SellDate , '2007-8-1 ')=0
group by typNam) w0 on a.typNam=w0.typNam
left outer join (
SELECT typNam ,
Count(case when ColorID=1 then ColorID end )as N 'w-1白 ' ,
Count( case when ColorID=2 then ColorID end) as N 'w-1银 ' ,
Count( case when ColorID=3 then Colo