求一条SQL优化,不要嵌套
求一条SQL优化,不用嵌套
有没有办法一条SQL搞定不用嵌套或者零时表,求高手解答!
------解决方案--------------------
貌似没办法不嵌套
------解决方案--------------------
聚合函数不能嵌套,所以你这个不能一句话搞定
------解决方案--------------------
这个不能不嵌套,只能这么做,你写的已经不错了。
------解决方案--------------------
try this,
------解决方案--------------------
唐诗你好像理解错了,他这个语句重复IP注册数是根据计算的注册个数来判断的,所以一句搞不定的啊
------解决方案--------------------
从字段名"重复IP注册数"来理解,其算法应该是ip去重复后的个数,即count(distinct ip).
从楼主的代码看: SUM(case when 注册个数>=2 then 注册个数 else 0 end)
应该是单ip注册个数大于等于2的注册个数总和.
二者好像不太一致喔.
;with #t as (
select 'gao_ps' ss,'192.168.0.1' ip,1 is_reg,1 has_code
union all select 'gao_ps','192.168.0.1',1,1
union all select 'gao_ps','192.168.1.1',1,1
union all select 'gao_ps','192.168.1.1',0,1
)
/* 从这里开始有没有办法不用嵌套 */
select ss,SUM(注册个数) 注册个数,
SUM(弹代码数) 弹代码数,
SUM(case when 注册个数>=2 then 注册个数 else 0 end) 重复IP注册数
from (
select ss,ip,COUNT(1) 注册个数,
SUM(case when has_code=1 then 1 else 0 end) 弹代码数
from #t
where is_reg=1
group by ss,ip) a
group by ss
有没有办法一条SQL搞定不用嵌套或者零时表,求高手解答!
------解决方案--------------------
貌似没办法不嵌套
------解决方案--------------------
聚合函数不能嵌套,所以你这个不能一句话搞定
------解决方案--------------------
这个不能不嵌套,只能这么做,你写的已经不错了。
------解决方案--------------------
try this,
with #t as
(select 'gao_ps' ss,'192.168.0.1' ip,1 is_reg,1 has_code union all
select 'gao_ps','192.168.0.1',1,1 union all
select 'gao_ps','192.168.1.1',1,1 union all
select 'gao_ps','192.168.1.1',0,1
)
select ss,
count(1) '注册个数',
sum(case when has_code=1 then 1 else 0 end) '弹代码数',
count(distinct ip) '重复IP注册数'
from #t
where is_reg=1
group by ss
/*
ss 注册个数 弹代码数 重复IP注册数
------ ----------- ----------- -----------
gao_ps 3 3 2
(1 row(s) affected)
*/
------解决方案--------------------
唐诗你好像理解错了,他这个语句重复IP注册数是根据计算的注册个数来判断的,所以一句搞不定的啊
------解决方案--------------------
从字段名"重复IP注册数"来理解,其算法应该是ip去重复后的个数,即count(distinct ip).
从楼主的代码看: SUM(case when 注册个数>=2 then 注册个数 else 0 end)
应该是单ip注册个数大于等于2的注册个数总和.
二者好像不太一致喔.