create proc kk(
@spnumber varchar(20),
@cooperatorid varchar(20),
@begindate varchar(20),
@enddate varchar(20)
)
as
declare @sql varchar(200)
set @sql='select count(1) from tbl '  --计算行数,要显示其他字段,自己列出即可
if @spnumber=''
   set @sql=@sql+'group by province '
else
   set @sql=@sql+'group by spnumber 'if @cooperatorid!=''
   set @sql=@sql+',coorperatorid 'if @begindate!=''
  set @sql=@sql+',begindate 'if @enddate!=''
  set @sql=@sql+',enddate 'exec(@sql)
go

解决方案 »

  1.   

    create proc kk(
    @begindate varchar(20),
    @enddate varchar(20),
    @spnumber varchar(20)=null,
    @cooperatorid varchar(20)=null
    )
    as
    declare @sql varchar(200)
    set @sql='select count(1) from tbl where dt between @begindate and @enddate ' 
    if @spnumber  is not null
       set @sql=@sql+'group by spnumber '
    else
       set @sql=@sql+'group by  province 'if @cooperatorid is not null
       set @sql=@sql+',coorperatorid 'exec(@sql)
    go
      

  2.   

    除了要count之外,还要得到字段名啊。。
    如group by spnumber的话,在select中除了count(1)之外,还要选出spnumber在前台显示的
      

  3.   

    除此之外, begindate 和enddate 是作为group by 还是条件处理呢?
      

  4.   

    --分两部分处理
    create proc kk(
    @spnumber varchar(20),
    @cooperatorid varchar(20),
    @begindate varchar(20),
    @enddate varchar(20)
    )
    as
    declare @sql1 varchar(200),@sql2 varchar(200)
    set @sql1='select '
    set @sql2=' count(1) from tbl ' 
    if @spnumber=''
      begin
       set @sql1=@sql1+'province '
       set @sql2=@sql2+'group by province '
      end
    else
      begin
       set @sql1=@sql1+' spnumber'
       set @sql2=@sql2+'group by spnumber '
      endif @cooperatorid!=''
      begin
       set @sql1=@sql1+',coorperatorid'
       set @sql2=@sql2+',coorperatorid '
      endif @begindate!=''
      begin
       set @sql1=@sql1+',begindate'
       set @sql2=@sql2+',begindate '
      endif @enddate!=''
      begin
      set @sql1=sql1+',enddate '
      set @sql2=@sql2+',enddate '
      endexec(@sql1+@sql2)
    go
      

  5.   

    create proc p(
    @begindate varchar(20),
    @enddate varchar(20),
    @spnumber varchar(20)=null,
    @cooperatorid varchar(20)=null
    )
    as
    declare @sql varchar(8000),@col varchar(8000)
    if @spnumber  is not null
       select @sql=' group by spnumber ',@col=spnumber
    else
       select @sql=' group by  province ',@col=provinceif @cooperatorid is not null
       select @sql=@sql+',cooperatorid ',@col=@col+',cooperatorid 'exec('select '+@col+',count(1) from tb  where dt between @begindate and @enddate '+@sql )
    go
      

  6.   

    字符串不等于空为:
    if @cooperatorid<>'' 这样写的 :(
      

  7.   

    --分两部分处理
    create proc kk(
    @spnumber varchar(20),
    @cooperatorid varchar(20),
    @begindate varchar(20),
    @enddate varchar(20)
    )
    as
    declare @sql1 varchar(200),@sql2 varchar(200)
    select @sql1='select ', @sql2=' count(1) from tbl ' 
    if @spnumber=''
      select @sql1=@sql1+'province ',@sql2=@sql2+'group by province '
    else
       select @sql1=@sql1+' spnumber',@sql2=@sql2+'group by spnumber 'if @cooperatorid<>''
       select @sql1=@sql1+',coorperatorid',@sql2=@sql2+',coorperatorid 'if @begindate<>''
      select @sql1=@sql1+',begindate',@sql2=@sql2+',begindate 'if @enddate<>''
      select  @sql1=sql1+',enddate ', @sql2=@sql2+',enddate 'exec(@sql1+@sql2)
    go