zjcxc(邹建):主要是给你的TEST的数据 的基本数据编号 说明有错误,是不重复的.如果修改你原来的表中基本数据编号不重复 就错误了.

解决方案 »

  1.   

    不好意思,还是第一个问题!
    zjcxc(邹建):上述的问题已解决,已出现错误了,就是上述情况
      ,现在要加分组一个小计.参数如下的调用.(因为检查的内容有200多项横的方式,所以检查内容分组)
    exec p_qry '4,5,7;3,6','2005-1-3','2005-1-8',2 
    这样表表示4,5,7 小计一次,组名 检查内容1 ,3,6小计一次 组名 检查内容2,(在分组时分组个数 不规则 ,有3 项  有两项  ) 检查内容1     环境          看见          环有 
    -----------------------------------------------------
    合计         
    检查内容1     各个   就是   
    ---------------------------------------
    合计 
      

  2.   

    zjcxc(邹建):主要是给你的TEST的数据 的基本数据编号 说明有错误,是不重复的.如果修改你原来的表中基本数据编号不重复 就错误了.
    不明白什么意思,统计中没有涉及到 数据基本表
      

  3.   

    现在要加分组一个小计.参数如下的调用.(因为检查的内容有200多项横的方式,所以检查内容分组)
    exec p_qry '4,5,7;3,6','2005-1-3','2005-1-8',2 
    这样表表示4,5,7 小计一次,组名 检查内容1 ,3,6小计一次 组名 检查内容2,(在分组时分组个数 不规则 ,有3 项  有两项  ) 检查内容1     环境          看见          环有 
    -----------------------------------------------------
    合计         
    检查内容1     各个   就是   
    ---------------------------------------
    合计 
      

  4.   

    那么帮助我看我http://community.csdn.net/Expert/topic/3710/3710687.xml?temp=.9876062 的打印SQL是否有错误. 现在出现次数 没有作用
      

  5.   


    --测试数据
    create table 企业表(单位名称 nvarchar(10),单位编号 varchar(10),企业类型 int)
    insert 企业表 select '武夫公司'  ,'4-0001',4
    union  all    select '恢复感公司','3-0002',3create table 企业类型表(企业类型名称 nvarchar(10),编号 int)
    insert 企业类型表 select '机械',4
    union  all       select '药品',3create table 检查项目表(检查名称 nvarchar(10),检查编号 int)
    insert 检查项目表 select '反对',2
    union  all       select '各个',3
    union  all       select '环境',4
    union  all       select '看见',5
    union  all       select '就是',6
    union  all       select '环有',7
    union  all       select '一计',8create table 数据基本表(数据基本编号 int,单位名称 nvarchar(10),单位编号 varchar(10),企业类型 int,数据时间 datetime)
    insert 数据基本表 select '1','武夫公司'  ,'4-0001',4,'2005-1-8 14:25:39'
    union  all       select '2','恢复感公司','3-0002',3,'2005-1-3 11:15:39'
    union  all       select '3','恢复感公司','3-0002',3,'2005-1-5 11:15:39'
    union  all       select '4','恢复感公司','3-0002',3,'2005-1-6 11:15:39'
    union  all       select '5','恢复感公司','3-0002',3,'2005-1-7 11:15:39'
    union  all       select '6','恢复感公司','3-0002',3,'2005-1-8 11:15:39'create table 数据结果副表(数据基本编号 int,单位编号 varchar(10),检查编号 int,数据时间 datetime)
    insert 数据结果副表 select 1,'4-0001',2,'2005-1-8 14:25:39'
    union  all         select 1,'4-0001',3,'2005-1-8 14:25:39'
    union  all         select 1,'4-0001',4,'2005-1-8 14:25:39'
    union  all         select 1,'4-0001',5,'2005-1-8 14:25:39'
    union  all         select 1,'4-0001',8,'2005-1-8 14:25:39'
    union  all         select 2,'3-0002',2,'2005-1-3 11:15:39'
    union  all         select 2,'3-0002',3,'2005-1-3 11:15:39'
    union  all         select 2,'3-0002',7,'2005-1-3 11:15:39'
    union  all         select 2,'3-0002',5,'2005-1-3 11:15:39'
    union  all         select 5,'3-0002',8,'2005-1-7 11:15:39'
    union  all         select 4,'3-0002',7,'2005-1-6 11:15:39'
    union  all         select 3,'3-0002',4,'2005-1-5 11:15:39'
    union  all         select 5,'3-0002',7,'2005-1-7 11:15:39'
    union  all         select 6,'3-0002',7,'2005-1-8 11:15:39'
    go--查询的存储过程
    create proc p_qry
    @检查项目 varchar(4000),
    @开始日期 datetime,
    @结束日期 datetime,
    @次数 int
    as
    set nocount on
    declare @s nvarchar(4000),@str varchar(4000)
    set @s=N'
    declare @fd1 varchar(8000),@fd2 varchar(8000),@fd3 varchar(8000)
    ,@dtbegin varchar(10),@dtend varchar(10)
    ,@cnt varchar(20)select @fd1='''',@fd2='''',@fd3=''''
    ,@dtbegin=convert(char(10),@开始日期,120)
    ,@dtend=convert(char(10),@结束日期+1,120)
    ,@cnt=@次数
    select @fd1=@fd1+N'',b.[''+rtrim(检查名称)+N'']''
    ,@fd2=@fd2+N'',[''+rtrim(检查名称)+N'']=sum(case 检查编号 when ''
    +rtrim(检查编号)+N'' then 1 else 0 end)''
    ,@fd3=@fd3+N'',sum([''+rtrim(检查名称)+N''])''
    from 检查项目表
    where charindex('',''+rtrim(检查编号)+'','','',''+@检查项目+'','')>0exec(''
    select 单位名称=a.单位名称
    ''+@fd1+''
    ,b.合计
    into #t from 企业表 a right join(
    select 单位编号
    ''+@fd2+''
    ,合计=count(*)
    from 数据结果副表
    where 数据时间>=''''''+@dtbegin+''''''
    and 数据时间<''''''+@dtend+''''''
    and 检查编号 in(''+@检查项目+'')
    group by 单位编号
    having count(*)>=''+@cnt+''
    )b on a.单位编号=b.单位编号
    select * from #t
    union all
    select ''''合计''''''+@fd3+'',sum(合计) from #t
    '')'
    while @检查项目>''
    begin
    select @str=left(@检查项目,charindex(';',@检查项目+';')-1)
    ,@检查项目=stuff(@检查项目,1,len(@str)+1,'')
    exec sp_executesql @s
    ,N'@检查项目 varchar(4000),
    @开始日期 datetime,
    @结束日期 datetime,
    @次数 int'
    ,@str,@开始日期,@结束日期,@次数
    end
    go--调用示例
    exec p_qry '4,5,7;3,6','2005-1-3','2005-1-8',1
    go--删除测试
    drop proc p_qry
    drop table 企业表,企业类型表,检查项目表,数据基本表,数据结果副表/*--测试结果单位名称       环境          看见          环有          合计          
    ---------- ----------- ----------- ----------- ----------- 
    恢复感公司      1           1           4           6
    武夫公司       1           1           0           2
    合计         2           2           4           8单位名称       各个          就是          合计          
    ---------- ----------- ----------- ----------- 
    恢复感公司      1           0           1
    武夫公司       1           0           1
    合计         2           0           2
    --*/
      

  6.   

    什么第一,第二个问题的,头晕了你最好把问题重新整理一下,重新说明表间关系和要求处理结果示例数据可以发到[email protected]
      

  7.   

    第一个问题:create procedure prd_test
       @strdate varchar(10) ,  --日期范围的起始日期,如:'2005-01-01'
       @enddate varchar(10) ,  --日期范围的截止日期,如:'2005-01-06'
       @times   varchar(2)  ,  --编号重复出现的次数,如:'2'
       @var     varchar(100)   --检查编号的取值范围:如:'4,5,7'
    AS
    declare @str1 varchar(1000)
    declare @str2 varchar(1000)
    declare @var1 varchar(100)
    declare @var2 varchar(100)beginset @str1 =
    'select 
        a.单位编号
     from 
        数据基本表   a
     inner join 
        
        数据结果副表 b
     on
        a.单位编号 = b.单位编号 and a.数据时间 = b.数据时间
     inner join    
        检查项目表   c
     on
        b.检查编号 = c.检查编号
     where
        (a.数据时间 between cast('''+@strdate+''' as datetime) and cast('''+@enddate+''' as datetime)) 
        and b.检查编号 in('+@var+')
     group by
        a.单位编号
     having count(*)>'+@times+'-1'
    set @var1 = @var
    set @str2 = ''while(charindex(',',@var1)>0)
    begin
       set @var2 = left(@var1,charindex(',',@var1)-1)
       set @str2 = @str2 + ',['+(select 检查名称 from 检查项目表 where 检查编号 = @var2)+']=sum(case m.检查编号 when '+@var2+' then 1 else 0 end)'
       set @var1 = stuff(@var1,1,len(@var2)+1,'')
    endset @str2 = @str2+',['+(select 检查名称 from 检查项目表 where 检查编号 = @var2)+']=sum(case m.检查编号 when '+@var1+' then 1 else 0 end)'
    set @str2 = @str2+',[合计]=sum(case when m.检查编号 in('+@var+') then 1 else 0 end)'
    print @str2
    exec('select l.单位名称 '+@str2+' from 企业表 l, 数据结果副表 m,('+@str1+') n where l.单位编号 = m.单位编号 and l.单位编号 = n.单位编号 and (m.数据时间 between cast('''+@strdate+''' as datetime) and cast('''+@enddate+''' as datetime)) group by l.单位名称')
    end
    Go
      

  8.   

    libin_ftsafe(子陌红尘) :通不过 !
      

  9.   

    第二个问题:Create procedure prd_test1
       @strdate varchar(10) ,  --日期范围的起始日期,如:'2005-01-01'
       @enddate varchar(10) ,  --日期范围的截止日期,如:'2005-01-06'
       @times   varchar(2)  ,  --编号重复出现的次数,如:'2'
       @var     varchar(100)   --检查编号的取值范围:如:'2,3;4,5,6;7,8'
    AS
    declare @str1 varchar(1000)
    declare @str2 varchar(1000)
    declare @var0 varchar(100)
    declare @var1 varchar(100)
    declare @var2 varchar(100)begin
      while(charindex(';',@var)>0)
      begin 
        set @var0 = left(@var,charindex(';',@var)-1)
        set @var1 = left(@var,charindex(';',@var)-1)
        
        print @var0
        
        set @str1 = ''    set @str1 = @str1 +
        'select 
            a.单位编号
         from 
            数据基本表   a
         inner join 
            
            数据结果副表 b
         on
            a.单位编号 = b.单位编号 and a.数据时间 = b.数据时间
         inner join    
            检查项目表   c
         on
            b.检查编号 = c.检查编号
         where
            (a.数据时间 between cast('''+@strdate+''' as datetime) and cast('''+@enddate+''' as datetime)) 
            and b.检查编号 in('+@var0+')
         group by
            a.单位编号
         having count(*)>'+@times+'-1'   
        set @str2 = ''
      
        while(charindex(',',@var1)>0)
        begin
           set @var2 = left(@var1,charindex(',',@var1)-1)
           set @str2 = @str2 + ',['+(select 检查名称 from 检查项目表 where 检查编号 = @var2)+']=sum(case m.检查编号 when '+@var2+' then 1 else 0 end)'
           set @var1 = stuff(@var1,1,len(@var2)+1,'')
        end
      
        set @str2 = @str2+',['+(select 检查名称 from 检查项目表 where 检查编号 = @var2)+']=sum(case m.检查编号 when '+@var1+' then 1 else 0 end)'
        set @str2 = @str2+',[合计]=sum(case when m.检查编号 in('+@var0+') then 1 else 0 end)'
        print @str2
      
      
        exec('select l.单位名称 '+@str2+' from 企业表 l, 数据结果副表 m,('+@str1+') n where l.单位编号 = m.单位编号 and l.单位编号 = n.单位编号 and (m.数据时间 between cast('''+@strdate+''' as datetime) and cast('''+@enddate+''' as datetime)) group by l.单位名称')    set @var = stuff(@var,1,len(@var0)+1,'')
      end
      
        set @var0 = @var
      set @var1 = @var
      
      print @var0
      
      set @str1 = ''  set @str1 = @str1 +
      'select 
          a.单位编号
       from 
          数据基本表   a
       inner join 
          
          数据结果副表 b
       on
          a.单位编号 = b.单位编号 and a.数据时间 = b.数据时间
       inner join    
          检查项目表   c
       on
          b.检查编号 = c.检查编号
       where
          (a.数据时间 between cast('''+@strdate+''' as datetime) and cast('''+@enddate+''' as datetime)) 
          and b.检查编号 in('+@var0+')
       group by
          a.单位编号
       having count(*)>'+@times+'-1' 
      set @str2 = ''
     
      while(charindex(',',@var1)>0)
      begin
         set @var2 = left(@var1,charindex(',',@var1)-1)
         set @str2 = @str2 + ',['+(select 检查名称 from 检查项目表 where 检查编号 = @var2)+']=sum(case m.检查编号 when '+@var2+' then 1 else 0 end)'
         set @var1 = stuff(@var1,1,len(@var2)+1,'')
      end
     
      set @str2 = @str2+',['+(select 检查名称 from 检查项目表 where 检查编号 = @var2)+']=sum(case m.检查编号 when '+@var1+' then 1 else 0 end)'
      set @str2 = @str2+',[合计]=sum(case when m.检查编号 in('+@var0+') then 1 else 0 end)'
      print @str2
     
     
      exec('select l.单位名称 '+@str2+' from 企业表 l, 数据结果副表 m,('+@str1+') n where l.单位编号 = m.单位编号 and l.单位编号 = n.单位编号 and (m.数据时间 between cast('''+@strdate+''' as datetime) and cast('''+@enddate+''' as datetime)) group by l.单位名称')end
    GO--执行:
    exec prd_test1 '2005-01-01','2005-01-06','1','2,3,4;5,6;7,8'
      

  10.   

    我把我这边的测试数据导出来,我执行都已经成功了:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[企业类型表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[企业类型表]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[企业表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[企业表]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[数据基本表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[数据基本表]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[数据结果副表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[数据结果副表]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[检查项目表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[检查项目表]
    GOCREATE TABLE [dbo].[企业类型表] (
    [企业类型名称] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [编号] [int] NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[企业表] (
    [单位名称] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [单位编号] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [企业类型] [int] NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[数据基本表] (
    [数据基本编号] [int] NULL ,
    [单位名称] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [单位编号] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [企业类型] [int] NULL ,
    [数据时间] [datetime] NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[数据结果副表] (
    [数据基本编号] [int] NULL ,
    [单位编号] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [检查编号] [int] NULL ,
    [数据时间] [datetime] NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[检查项目表] (
    [检查名称] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [检查编号] [int] NULL 
    ) ON [PRIMARY]
    GO
      

  11.   

    以上存储过程我是根据楼主在主帖里帖出来的脚本和数据,在我的机器上调试通过的代码前一个prd_test的调用方式:
    exec prd_test  '2005-01-01','2005-01-06','1','2,3,4,7'前一个prd_test1的调用方式:
    exec prd_test1 '2005-01-01','2005-01-06','1','2,3,4;5,6;7,8'
      

  12.   

    select b.单位名称,sum(a.反对) As '反对',sum(a.各个) As '各个',sum(a.环境) As '环境',sum(a.看见) As '看见',sum(a.就是) As '就是',sum(a.环有) As '环有',sum(a.合计) As '合计'
    from (
          select 单位编号,
          (case when 检查编号=2 then count(*) else 0) As '反对',
          (case when 检查编号=3 then count(*) else 0) As '各个',
          (case when 检查编号=4 then count(*) else 0) As '环境',
          (case when 检查编号=5 then count(*) else 0) As '看见',
          (case when 检查编号=6 then count(*) else 0) As '就是',
          (case when 检查编号=7 then count(*) else 0) As '环有',
          count As '合计'
    from 数据结果副表
    where 条件
    ) a,
    数据基本表 b
    where a.单位编号 = b.单位编号
    group by b.单位名称
    having sum(a.检查项目字段) > @指定次数  (指定任意检查项目的数次数)
      

  13.   

    服务器: 消息 245,级别 16,状态 1,过程 prd_test2,行 41
    将 varchar 值 ',[' 转换为数据类型为 int 的列时发生语法错误。
      

  14.   

    SQL通过 但是同样的问题 次数没有作用
      

  15.   

    例:我检查的项目 "2,3,4" 出现的次数是>2次以上,那么 如果如果某一单位检查项目其中"2" 出现1次, "3"出现3次
    "4" 出现 "2" 结果是这样
    单位     检查项目名2  检查项目名3   检查项目名4  
    ------------------------------------------------
    单位名     null      3              4
    合计       null      3              4
      

  16.   

    错误了
    例:我检查的项目 "2,3,4" 出现的次数是>2次以上,那么 如果如果某一单位检查项目其中"2" 出现1次, "3"出现3次
    "4" 出现 "2" 结果是这样
    单位     检查项目名2  检查项目名3   检查项目名4  
    ------------------------------------------------
    单位名     null      3              null
    合计       null      3               null
    例:我检查的项目 "2,3,4" 出现的次数是>=2次以上,那么 如果如果某一单位检查项目其中"2" 出现1次, "3"出现3次
    "4" 出现 "2" 结果是这样单位     检查项目名2  检查项目名3   检查项目名4  
    ------------------------------------------------
    单位名     null      3             2
    合计       null      3             2
      

  17.   

    CREATE proc printprc4_1
    @JFKMBID varchar(20),
    @JFKMBSYSID varchar(1000),
    @date1 datetime,
    @date2 datetime,
    @r_count intas
    set nocount on
    declare @fd1 varchar(8000),@fd2 varchar(8000),@fd3 varchar(8000)
    ,@dtbegin varchar(10),@dtend varchar(10)
    ,@cnt varchar(20)select @fd1='',@fd2='',@fd3=''
    ,@dtbegin=convert(char(10),@date1,120)
    ,@dtend=convert(char(10),@date2+1,120)
    ,@cnt=@r_count
    select @fd1=@fd1+N',['+rtrim(PX)+N']=case when b.['+rtrim(PX)+N']>='+@cnt+' then b.['+rtrim(PX)+N'] end'
    ,@fd2=@fd2+N',['+rtrim(PX)+N']=sum(case jFKMBSYSID when '
    +rtrim(jFKMBSYSID)+N' then 1 else 0 end)'
    ,@fd3=@fd3+N',sum(['+rtrim(PX)+N'])'
    from S_IntegralMode
    where charindex(','+rtrim(jFKMBSYSID)+',',','+@JFKMBSYSID+',')>0 and JFKMBID=''+@JFKMBID+'' exec('
    select 单位名称=a.qymc 
    '+@fd1+'
    ,b.合计
    into #t from S_Enterprise a right join(
    select qydm
    '+@fd2+'
    ,合计=count(*)
    from S_PntegralFactInfo
    where slsj>='''+@dtbegin+'''
    and slsj<'''+@dtend+'''
     and jFKMBSYSID in('+@JFKMBSYSID+')  and JFKMBID='''+@JFKMBID+'''
    group by qydm
    )b on a.qydm=b.qydm
    select * from #t
    union all
    select ''合计'''+@fd3+',sum(合计) from #t
    ')
    GOexec printprc4_1 '4-2005','45,46,47,48,49,50,51,52,53,54,55,56,57,58,59','2005-1-1','2005-1-31',2
      

  18.   

    象山医药药材有限公司医药商店 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 15
    象山同仁堂大药房药业有限公司 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 45
    合计 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 60
    ------------------------------
    象山医药药材有限公司医药商店 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 15
    -------------------不应该出现的 也就是
      

  19.   

    右边合计可以不要的,我去掉了右边, 我加了 group by qydm  having count(jFKMBSYSID)>=1 来控制是否全部空 好象没有反应
      

  20.   

    --继续改条件限制位置CREATE proc printprc4_1
    @JFKMBID varchar(20),
    @JFKMBSYSID varchar(1000),
    @date1 datetime,
    @date2 datetime,
    @r_count intas
    set nocount on
    declare @fd1 varchar(8000),@fd2 varchar(8000),@fd3 varchar(8000)
    ,@dtbegin varchar(10),@dtend varchar(10)
    ,@cnt varchar(20)select @fd1='',@fd2='',@fd3=''
    ,@dtbegin=convert(char(10),@date1,120)
    ,@dtend=convert(char(10),@date2+1,120)
    ,@cnt=@r_count
    select @fd1=@fd1+N',['+rtrim(PX)+N']=case when b.['+rtrim(PX)+N']>='+@cnt+' then b.['+rtrim(PX)+N'] end'
    ,@fd2=@fd2+N',['+rtrim(PX)+N']=sum(case jFKMBSYSID when '
    +rtrim(jFKMBSYSID)+N' then cnt else 0 end)'
    ,@fd3=@fd3+N',sum(['+rtrim(PX)+N'])'
    from S_IntegralMode
    where charindex(','+rtrim(jFKMBSYSID)+',',','+@JFKMBSYSID+',')>0 and JFKMBID=''+@JFKMBID+'' exec('
    select 单位名称=a.qymc 
    '+@fd1+'
    into #t from S_Enterprise a right join(
    select qydm
    '+@fd2+'
    from(
    select qydm,jFKMBSYSID,cnt=count(*)
    from S_PntegralFactInfo
    where slsj>='''+@dtbegin+'''
    and slsj<'''+@dtend+'''
    and jFKMBSYSID in('+@JFKMBSYSID+')  and JFKMBID='''+@JFKMBID+'''
    group by qydm,jFKMBSYSID
    )a group by qydm
    having count(*)=sum(case when cnt>='+@cnt+' then 1 else 0 end)
    )b on a.qydm=b.qydm
    select * from #t
    union all
    select ''合计'''+@fd3+' from #t
    ')
    GOexec printprc4_1 '4-2005','45,46,47,48,49,50,51,52,53,54,55,56,57,58,59','2005-1-1','2005-1-31',2
      

  21.   

    CREATE proc p_qry
    @JFKMBID varchar(20),
    @JFKMBSYSID varchar(1000),
    @date1 datetime,
    @date2 datetime,
    @r_count int
    as
    set nocount on--分拆 @JFKMBSYSID
    declare @i int
    set @i=len(@JFKMBSYSID)
    if isnull(@i,0)<1 return
    set rowcount @i
    select id=identity(int) into #t from syscolumns a,syscolumns b
    set rowcount @i
    select jFKMBSYSID=substring(@JFKMBSYSID,id,patindex('%[,;]%',stuff(@JFKMBSYSID+',',1,id,'')))
    ,gid=case when substring(','+@JFKMBSYSID,id,1)=',' then 0 else 1 end,sid=0
    into #t1 from #t
    where substring(','+@JFKMBSYSID,id,1) in(',',';')
    order by id--生成分组标志
    select @i=1
    update #t1 set @i=case when gid=0 then @i else @i+1 end,gid=@i--生成处理数据
    select a1.gid,a2.PX,b.qydm,cnt=count(*),sid=0
    into #t2
    from #t1 a1,S_IntegralMode a2,S_PntegralFactInfo b
    where a1.jFKMBSYSID=a2.jFKMBSYSID
    and a2.jFKMBSYSID=b.jFKMBSYSID
    and b.slsj>=convert(char(10),@date1,120)
    and b.slsj<convert(char(10),@date2+1,120)
    and b.JFKMBID=@JFKMBID
    group by a1.gid,a2.PX,b.qydm
    order by a1.gid,a2.PX,b.qydm--去掉不符合条件的记录
    delete a from #t2 a
    where not exists(
    select * from #t2
    where qydm=a.qydm and gid=a.gid and cnt>=@r_count)--生成交叉表处理标志
    declare @gid int,@PX int
    set @i=1
    update #t2 set @i=case when @gid=gid 
    then case when @PX=PX then @i else @i+1 end
    else 1 end
    ,@gid=gid,@PX=PX,sid=@i--生成交叉表处理语句
    declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000),@s4 varchar(8000)
    select @s1='',@s2='',@s3='',@s4=''
    ,@i=max(sid) from #t2
    while @i>0
    select @s1=',[col'+rtrim(@i)
    +']=cast(sum(case sid when '+rtrim(@i)
    +' then cnt else 0 end) as varchar)'+@s1
    ,@s2=',[col'+rtrim(@i)
    +']=max(case sid when '+rtrim(@i)
    +' then cast(PX as varchar) else '''' end)'+@s2
    ,@s3=',a.[col'+rtrim(@i)+']'+@s3
    ,@i=@i-1--显示结果
    exec('
    select qymc=isnull(b.qymc,a.qydm)'+@s3+'
    from(
    select gid,qydm,s1=1'+@s1+' from #t2 group by gid,qydm
    union all
    select gid,''查询分组''+rtrim(gid),s1=0'+@s2+' from #t2 group by gid
    union all
    select gid,''分组''+rtrim(gid)+''合计'',s1=2'+@s1+' from #t2 group by gid
    )a left join S_Enterprise b on a.qydm=b.qydm
    order by a.gid,a.s1,a.qydm
    ')
    GOexec p_qry '4-2005','45,46,47,48;49,50,51,52,53;54,55;56,57,58;59','2005-1-1','2005-1-31',1
    godrop proc p_qry/*--测试结果qymc                             col1 col2 col3 col4 col5
    ------------------------------------ ------- -------- -------- -------- ----------
    查询分组式                           1 1 2 3 4
    象山医药药材有限公司医药商店         1 1 1 1 0
    象山同仁堂大药房药业有限公司         3 3 3 3 0
    分组1合计                            4 4 4 4 0
    查询分组2                            5 6 7 8 9
    象山医药药材有限公司医药商店         1 1 1 1 1
    象山同仁堂大药房药业有限公司         3 3 3 3 3
    分组2合计                            4 4 4 4 4
    查询分组3                            10 11
    象山医药药材有限公司医药商店         1 1 0 0 0
    象山同仁堂大药房药业有限公司         3 3 0 0 0
    分组3合计                            4 4 0 0 0
    查询分组4                            12 13 14
    象山医药药材有限公司医药商店         1 1 1 0 0
    象山同仁堂大药房药业有限公司         3 3 3 0 0
    分组4合计                            4 4 4 0 0
    查询分组5                            15
    象山医药药材有限公司医药商店         1 0 0 0 0
    象山同仁堂大药房药业有限公司         3 0 0 0 0
    分组5合计                            4 0 0 0 0
    --*/