读书人

求sql优化。高报送

发布时间: 2012-07-01 13:15:00 作者: rapoo

求sql优化。。高分送
请优化以下sql,我本意是想用sum来统计,但是我还要做user_id(varchar型)排重 ,sum我没有办法对varchar型的user_id排重(反正我不会),所以现在用count来统计,可是效率很低需要30多秒才能出结果,求高手优化。。

SQL code
select 'stat_time' = '2011-04', 'fixed_net' = count(distinct case certify_user_type when 1 then user_id else null end ) ,'school_net' = count(distinct case certify_user_type when 3 then user_id else null end ),'differ_net' = count(distinct case certify_user_type when 4 then user_id else null end ),'wlan_net' = count(distinct case certify_user_type when 5 then user_id else null end ),'other_net' = count(distinct case certify_user_type when 0 then user_id else null end ),'oneType_user' = count(distinct case when user_type_id=1 and certify_user_type=2 then user_id else null end ) ,'twoType_user' = count(distinct case when user_type_id=2 and certify_user_type=2 then user_id else null end ),'threeType_user' = count(distinct case when user_type_id=3 and certify_user_type=2 then user_id else null end ),'other_user' = count(distinct case when user_type_id=99 and certify_user_type=2 then user_id else null end ),'local_rom' = count(distinct case romflag when 0 then user_id else null end ),'out_rom' = count(distinct case romflag when 1 then user_id else null end ),'in_rom' = count(distinct case romflag when 2 then user_id else null end ),'nation_out_rom' = count(distinct case romflag when 3 then user_id else null end ),'nation_in_rom' = count(distinct case romflag when 5 then user_id else null end ) from wlan_auth_user_vlan_2011_04 a





[解决办法]
来接分的有分木有啊,其实我是来学习的、嘿嘿
[解决办法]
user_id 是存的String的数字吗 是的话可以直接sum啊
[解决办法]
看见你的sql太麻烦了 我写一个列子把
2XiaoHong11-12115
3XiaoMing06-1119
4XiaoGang05-2319
5XiaoTian08-1420
以上为原始数据
SQL code
SELECT SUM(MID(t.birthDate,1,2)) FROM test_user t GROUP BY t.age
[解决办法]
select '2011-04' stat_time,
case certify_user_type when 1 then sum(cnt) else 0 end fixed_net,
case certify_user_type when 3 then sum(cnt) else 0 end school_net,
case certify_user_type when 4 then sum(cnt) else 0 end differ_net,
case certify_user_type when 5 then sum(cnt) else 0 end wlan_net,
case certify_user_type when 0 then sum(cnt) else 0 end other_net,
case when user_type_id=1 and certify_user_type=2 then sum(cnt) else 0 end oneType_user
......
select certify_user_type,user_type_id,romflag,count(distinct userid) cnt
from wlan_auth_user_vlan_2011_04 a group by certify_user_type,user_type_id,romflag

没测试,大概意思是这个,对这个结果集再处理下,应该就可以得到你想要的结果了,

你想要的应该是group by 后行转列吧
[解决办法]
SQL code
select '2011-04' stat_time,case  certify_user_type when 1 then sum(cnt) else 0 end fixed_net,case  certify_user_type when 3 then sum(cnt) else 0 end school_net,case  certify_user_type when 4 then sum(cnt) else 0 end differ_net,case  certify_user_type when 5 then sum(cnt) else 0 end wlan_net,case  certify_user_type when 0 then sum(cnt) else 0 end other_net,case when user_type_id=1 and certify_user_type=2 then sum(cnt) else 0 end oneType_user......from (select certify_user_type,user_type_id,romflag,count(distinct userid) cntfrom wlan_auth_user_vlan_2011_04 a group  by certify_user_type,user_type_id,romflag) t
[解决办法]
LZ 去数据库版可能会得到更好的答案。
------解决方案--------------------


每一个去distinct估计比较慢吧,整体distinct以后再统计试试看
(用你原来的count也可以(count(case certify_user_type when 1 then 1 else null end )),这里改为用sum)

SQL code
select 'stat_time' = '2011-04', 'fixed_net' = sum(case certify_user_type when 1 then 1 else 0 end ) ,'school_net' = sum(case certify_user_type when 3 then 1 else 0 end ),'differ_net' = sum(case certify_user_type when 4 then 1 else 0 end ),'wlan_net' = sum(case certify_user_type when 5 then 1 else 0 end ),'other_net' = sum(case certify_user_type when 0 then 1 else 0 end ),'oneType_user' = sum(case when user_type_id=1 and certify_user_type=2 then 1 else 0  end ) ,'twoType_user' = sum(case when user_type_id=2 and certify_user_type=2 then 1 else 0  end ),'threeType_user' = sum(case when user_type_id=3 and certify_user_type=2 then 1 else 0 end ),'other_user' = sum(case when user_type_id=99 and certify_user_type=2 then 1 else 0 end ),'local_rom' = sum(case romflag when 0 then 1 else 0 end ),'out_rom' = sum(case romflag when 1 then 1 else 0 end ),'in_rom' = sum(case romflag when 2 then 1 else 0 end ),'nation_out_rom' = sum(case romflag when 3 then 1 else 0 end ),'nation_in_rom' = sum(case romflag when 5 then 1 else 0 end ) from (select distinct user_id, user_type_id, certify_user_type, romflag        from wlan_auth_user_vlan_2011_04) a --把distinct统一在一起而不是每个都去distinct 

读书人网 >Java Web开发

热点推荐