首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

依据条件 进行group by 分组

2012-10-13 
根据条件 进行group by 分组最近有份代码原来写的意思大概如下如果条件1存在,使用资金代码(zjdm)进行分组

根据条件 进行group by 分组
最近有份代码原来写的意思大概如下
如果条件1存在,使用资金代码(zjdm)进行分组
如果条件2存在,使用交易代码(jydm)进行分组
如果条件1,2都存在,使用资金代码(zjdm)和交易代码(jydm)进行分组

SQL code
declare  @condition1 int ,@condition2 intdeclare @zlb table(    col1  float,    col2  float,    col3  float,    zljg  float,    zlsl  float,    zlje  float,    zjdm varchar(255),    jydm varchar(255) )declare @mrmcb table(     col1  float,     col2  float,     col3  float,     jg  float,     sl  float,     je  float,     zjdm varchar(255),     jydm varchar(255)  )declare @mrmcb_cale table(     col1  float,     col2  float,     col3  float,     jg  float,     sl  float,     je  float,     zjdm varchar(255),     jydm varchar(255) )declare @mrmcb_sum table(      col1  float,      col2  float,      col3  float,      jg  float,      sl  float,      je  float,     zjdm varchar(255),     jydm varchar(255)    )select @condition1 = 1,@condition2 = 1insert @zlb select 1,2,3,10,20,200,'买','张三'           union select  1,2,3,10,30,300,'买','张三'           union select  1,2,3,10,20,200,'买','李四'           union select  1,2,3,30,10,300,'买','李四'insert @mrmcb select 1,2,3,20,50,1000,'买','张三'           union select  1,2,3,10,20,200,'卖','张三'           union select  1,2,3,10,50,500,'买','李四'           union select  1,2,3,20,30,600,'卖','李四'if @condition1 = 0 and @condition2 = 0 -- 如果条件1和条件2都没有 begin     insert @mrmcb_cale                    select col1,col2,col3,max(zljg),sum(zlsl),sum(zlje),'',''                   from @zlb                   group by col1,col2,col3     insert @mrmcb_cale                     select col1,col2,col3,max(jg),sum(sl),sum(je),'',''                   from  @mrmcb                       group by col1,col2,col3     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),'',''                    from @mrmcb_cale                    group by col1,col2,col3                      endif @condition1 = 0 and @condition2 = 1  -- 如果条件2存在,使用交易代码(jydm)进行分组begin     insert @mrmcb_cale                    select col1,col2,col3,max(zljg),sum(zlsl),sum(zlje),'',jydm                   from @zlb                   group by col1,col2,col3,jydm     insert @mrmcb_cale                    select col1,col2,col3,max(jg),sum(sl),sum(je),'',jydm                   from  @mrmcb                       group by col1,col2,col3,jydm     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),'',jydm                    from @mrmcb_cale                    group by col1,col2,col3,jydm                      endif @condition1 = 1 and @condition2 = 0  -- 如果条件1存在,使用资金代码(zjdm)进行分组begin     insert @mrmcb_cale                     select col1,col2,col3,max(zljg),sum(zlsl),sum(zlje),zjdm,''                   from @zlb                   group by col1,col2,col3,zjdm     insert @mrmcb_cale                     select col1,col2,col3,max(jg),sum(sl),sum(je),zjdm,''                   from  @mrmcb                       group by col1,col2,col3,zjdm     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),zjdm,''                    from @mrmcb_cale                    group by col1,col2,col3,zjdm                      endif @condition1 = 1 and @condition2 = 1  -- 如果条件1,2都存在,使用资金代码(zjdm)和交易代码(jydm)进行分组begin      insert @mrmcb_cale                     select col1,col2,col3,max(zljg),sum(zlsl),sum(zlje),zjdm,jydm                   from @zlb                   group by col1,col2,col3,zjdm,jydm     insert @mrmcb_cale                     select col1,col2,col3,max(jg),sum(sl),sum(je),zjdm,jydm                   from  @mrmcb                       group by col1,col2,col3,zjdm,jydm     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),zjdm,jydm                    from @mrmcb_cale                    group by col1,col2,col3,zjdm,jydm                     endselect * from @mrmcb_sum 



想把这个代码缩短,优化,不喜欢看到重复的代码(强迫症。。。)下面贴2个自己优化的方法
方案1 (失败) group by 不能拆开
SQL code
-- 方案1 (失败) group by 不能拆开 设置condition1 = 1,@condition2 = 1 是结果错误select @condition1 = 1,@condition2 = 1        --设置条件insert @zlb select 1,2,3,10,20,200,'买','张三'   --插入测试数据           union select  1,2,3,10,30,300,'买','张三'           union select  1,2,3,10,20,200,'买','李四'           union select  1,2,3,30,10,300,'买','李四'insert @mrmcb select 1,2,3,20,50,1000,'买','张三'           union select  1,2,3,10,20,200,'卖','张三'           union select  1,2,3,10,50,500,'买','李四'           union select  1,2,3,20,30,600,'卖','李四'           if @condition1 = 0 begin     insert @mrmcb_cale            select col1,col2,col3,max(zljg) as jg,sum(zlsl) as sl,sum(zlje) as je,'' as zjdm,'' as jydm           from @zlb           group by col1,col2,col3                  endif @condition1 = 1begin     insert @mrmcb_cale            select col1,col2,col3,max(zljg) as jg,sum(zlsl) as sl,sum(zlje) as je,'' as zjdm,'' as jydm           from @zlb           group by col1,col2,col3,zjdm                  endif @condition2 = 0 begin     insert @mrmcb_cale            select col1,col2,col3,max(jg) as jg,sum(sl) as sl,sum(je) as je,'' as zjdm,'' as jydm           from @mrmcb           group by col1,col2,col3                     endif @condition2 = 0 begin     insert @mrmcb_cale            select col1,col2,col3,max(jg) as jg,sum(sl) as sl,sum(je) as je,'' as zjdm,jydm           from @mrmcb           group by col1,col2,col3,jydm                      endif @condition1 = 0 and @condition2 = 0begin     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),'',''                    from @mrmcb_cale                    group by col1,col2,col3endif @condition1 = 1 and @condition2 = 0begin     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),zjdm,''                    from @mrmcb_cale                    group by col1,col2,col3,zjdm  endif @condition1 = 0 and @condition2 = 1begin     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),'',jydm                    from @mrmcb_cale                    group by col1,col2,col3,jydm  endif @condition1 = 1 and @condition2 = 1begin     insert @mrmcb_sum                     select  col1,col2,col3,max(jg),sum(sl),sum(je),zjdm,jydm                    from @mrmcb_cale                    group by col1,col2,col3,zjdm,jydm  endselect * from @mrmcb_sum

方案2 (优化的还是不好,代码重复太多)
SQL code
--方案2 (优化的还是不好)select @condition1 = 1,@condition2 = 0        --设置条件insert @zlb select 1,2,3,10,20,200,'买','张三'   --插入测试数据           union select  1,2,3,10,30,300,'买','张三'           union select  1,2,3,10,20,200,'买','李四'           union select  1,2,3,30,10,300,'买','李四'insert @mrmcb select 1,2,3,20,50,1000,'买','张三'           union select  1,2,3,10,20,200,'卖','张三'           union select  1,2,3,10,50,500,'买','李四'           union select  1,2,3,20,30,600,'卖','李四'           if @condition1 = 0 and @condition2 = 0 -- 如果条件1和条件2都没有 begin     ;with      a  as      (           select col1,col2,col3,max(zljg) as jg,sum(zlsl) as sl,sum(zlje) as je,'' as zjdm,'' as jydm           from @zlb           group by col1,col2,col3           union           select col1,col2,col3,max(jg) as jg,sum(sl) as sl,sum(je) as je,'' as zjdm,'' as jydm           from  @mrmcb               group by col1,col2,col3     )     insert @mrmcb_sum               select  col1,col2,col3,max(jg),sum(sl),sum(je),'' as jydm,'' as zjdm              from a              group by col1,col2,col3                      endif @condition1 = 1 and @condition2 = 0  begin     ;with      a  as      (           select col1,col2,col3,max(zljg) as jg,sum(zlsl) as sl,sum(zlje) as je, zjdm,'' as jydm           from @zlb           group by col1,col2,col3,zjdm           union           select col1,col2,col3,max(jg) as jg,sum(sl) as sl,sum(je) as je, zjdm,'' as jydm           from  @mrmcb               group by col1,col2,col3,zjdm     )     insert @mrmcb_sum               select  col1,col2,col3,max(jg),sum(sl),sum(je), zjdm,'' as jydm              from a              group by col1,col2,col3,zjdm                      endif @condition1 = 0 and @condition2 = 1 begin     ;with      a  as      (           select col1,col2,col3,max(zljg) as jg,sum(zlsl) as sl,sum(zlje) as je,'' as zjdm,jydm           from @zlb           group by col1,col2,col3,jydm           union           select col1,col2,col3,max(jg) as jg,sum(sl) as sl,sum(je) as je,'' as zjdm,jydm           from  @mrmcb               group by col1,col2,col3,jydm     )     insert @mrmcb_sum               select  col1,col2,col3,max(jg),sum(sl),sum(je), '' as zjdm,jydm              from a              group by col1,col2,col3,jydm                      endif @condition1 = 1 and @condition2 = 1 begin     ;with      a  as      (           select col1,col2,col3,max(zljg) as jg,sum(zlsl) as sl,sum(zlje) as je,zjdm,jydm           from @zlb           group by col1,col2,col3,zjdm,jydm           union           select col1,col2,col3,max(jg) as jg,sum(sl) as sl,sum(je) as je,zjdm,jydm           from  @mrmcb               group by col1,col2,col3,zjdm,jydm     )     insert @mrmcb_sum               select  col1,col2,col3,max(jg),sum(sl),sum(je), zjdm,jydm              from a              group by col1,col2,col3,zjdm,jydm                      endselect * from @mrmcb_sum 


请各位大神看看优化下,最好不要有重复的代码。

[解决办法]
select col1,col2,col3,max(zljg),sum(zlsl),sum(zlje),case when @condition1 = 0 then '' else zjdm end as zjdm,
case when @condition2 = 0 then '' else jydm end as jydm
from @zlb
group by col1,col2,col3,case when @condition1 = 0 then '' else zjdm end,
case when @condition2 = 0 then '' else jydm end

热点排行