日期:2014-05-18  浏览次数:20575 次

group by 的分类问题
先说说表结构:
表   dhzl3   中有字段serv_state表示   状态,serv_type_   为设备类别
表   serv_ty_name   中有字段   id   ,s_name为设备名称,这个表我主要是用来根据serv_type_   的值来重命名的

我的分类查询语句如下:
select  
serv_type_,   s_name=(SELECT       s_name   FROM   serv_ty_name   WHERE   id=serv_type_),
sum(case   when   serv_state= 'F1N '   then   1   else   0   end)   as   新装,
sum(case   when   serv_state= 'F1R '   then   1   else   0   end)   as   拆机,
sum(case   when   serv_state= 'F1S '   then   1   else   0   end)   as   停机,
sum(case   when   serv_state!= 'F1R '   then   1   else   0   end)   as   到达数
from   dhzl3
where   serv_type_   in   (1000,1010,1003,1813,1006,1022,1027,1028)
group   by   serv_type_
order   by   serv_type_


查询结果如下:
serv_type_     s_name                   新装               拆机
1000     甲类固话                 415 352
1003     后付费小灵通         90 304
1006     无线农话 576 0
1010     乙类固话                 44 8
1022     公话                   27 20
1027     公话                   4 0
1028     公话                   3 0
1813     预付费小灵通         32 7


其中   1022,1027,1028   都是公话,但是是不同类型的公话,实际的情况是,我不需要分不同类型的公话,我要把1022,1027,1028   都只当作公话来看待,于是我要把这三种类型的公话的新装和拆机数给合计起来,我该怎么办?  


----------------------
问题长,看起来麻烦,所以,50分献给各位大大!

------解决方案--------------------
如上语句建立视图

然后select 视图 group by s_name
------解决方案--------------------
改三处可以不用建视图
select (case when serv_type_ in(1022,1027,1028) then 1022 else serv_type_ end)-------------1
serv_type_, s_name=(SELECT s_name FROM serv_ty_name WHERE id=serv_type_),
sum(case when serv_state= 'F1N ' then 1 else 0 end) as 新装,
sum(case when serv_state= 'F1R ' then 1 else 0 end) as 拆机,
sum(case when serv_state= 'F1S ' then 1 else 0 end) as 停机,
sum(case when serv_state!= 'F1R ' then 1 else 0 end) as 到达数
from dhzl3
where serv_type_ in (1000,1010,1003,1813,1006,1022,1027,1028)
group by (case when serv_type_ in(1022,1027,1028) then 1022 else serv_type_ end)-----------2
order by (case when serv_type_ in(1022,1027,1028) then 1022 else serv_type_ end)-----------3
------解决方案--------------------
这样改试试

select (case when serv_type_ in(1022,1027,1028) then 1022 else serv_type_ end),
s_name,
sum(case when serv_state= 'F1N ' then 1 else 0 end) as 新装,
sum(case when serv_state= 'F1R ' then 1 else 0 end) as 拆机,
sum(case when serv_state= 'F1S ' then 1 else 0 end) as 停机,
sum(case when serv_state!= 'F1R ' then 1 else 0 end) as 到达数
from dhzl3
inner join serv_ty_name on serv_ty_name.id=case when serv_type_ in(1022,1027,1028) then 1022 else serv_type_ end
where serv_type_ in (1000,1010,1003,1813,1006,1022,1027,1028)
group by (case wh