我想实现这样得效果
表 jylb yplb zs hgs hgl 
监督检测 旅店业 1 1 1 
监督检测 蒸馏酒 5 4 0.8 
委托检测 旅店业 1 1 1 
委托检测 蒸馏酒 2 2 1 
仲裁检测 蒸馏酒 2 2 1 
通过查询,要求用dbgrid显示如下
 
       合计     监督检测 委托检测 仲裁检测
合计   监测件数    6        3         2 
       合格件数    5        3         2 
       合格率      0.8      1         1 
旅店业 监测件数    1        1         / 
       合格件数    1        1         / 
       合格率      1        1         / 
蒸馏酒 监测件数    5        2         2 
       合格件数    4        2         2 
       合格率      0.8      1         1 

解决方案 »

  1.   

    行转列 + with rollup
      

  2.   

    select  isnull(yplb,'合计') 样品类别,
    '检测件数' as 类型,
    合计=ltrim(sum(isnull(cast(zs as float),0))),[监督检测]=max(CASE WHEN jylb='监督检测' THEN zs ELSE '0' END ) ,
    [鉴定检测]=max(CASE WHEN jylb='鉴定检测' THEN zs ELSE '0' END ) 
     from T_JCTJ GROUP BY yplb  with ROLLUP这样写,合计算出来是错误的,我哪里写错了,?
      

  3.   


    不管别的 case 都错了
    [鉴定检测]=max(CASE jylb WHEN jylb='鉴定检测' THEN zs ELSE '0' END )
      

  4.   


    if object_id ('tb') is not null
    drop table tb
    go
    create table tb(jylb varchar(10), yplb varchar(10), zs int , hgs int,  hgl float )
    insert into tb select '监督检测', '旅店业', 1, 1, 1 
    union all select '监督检测', '蒸馏酒', 5, 4, 0.8 
    union all select '委托检测', '旅店业', 1, 1, 1 
    union all select '委托检测', '蒸馏酒', 2, 2, 1 
    union all select '仲裁检测', '蒸馏酒', 2, 2, 1 select  isnull(yplb,'合计') 样品类别, 
    '检测件数' as 类型, 
    合计=ltrim(sum(isnull(cast(zs as float),0))), max(case jylb when '监督检测' then zs  else 0 end ) 监督检测,
    max(case jylb when '委托检测' then hgs else 0 end ) 委托检测,
    max(case jylb when '仲裁检测' then hgl else 0 end ) 仲裁检测
    from tb
    group by yplb
    with rollup
    /*样品类别       类型       合计                      监督检测        委托检测        仲裁检测
    ---------- -------- ----------------------- ----------- ----------- ----------------------
    旅店业        检测件数     2                       1           1           0
    蒸馏酒        检测件数     9                       5           2           1
    合计         检测件数     11                      5           2           1(3 行受影响)*/
      

  5.   

    --> 测试数据: [表]
    if object_id('[表]') is not null drop table [表]
    create table [表] (jylb varchar(8),yplb varchar(6),zs int,hgs int,hgl numeric(2,1))
    insert into [表]
    select '监督检测','旅店业',1,1,1 union all
    select '监督检测','蒸馏酒',5,4,0.8 union all
    select '委托检测','旅店业',1,1,1 union all
    select '委托检测','蒸馏酒',2,2,1 union all
    select '仲裁检测','蒸馏酒',2,2,1
    declare @sql varchar(4000),@sql1 varchar(4000),@sql2 varchar(4000)
    set @sql='select a=isnull(yplb,''合计''),[合计]=''监测件数'''
    set @sql1='select a=isnull(yplb,''合计''),[合计]=''合格件数'''
    set @sql2='select a=isnull(yplb,''合计''),[合计]=''合格率'''
    select @sql=@sql+',['+jylb+']=ltrim(sum(case jylb when '''+jylb+''' then zs else 0 end))',
    @sql1=@sql1+',['+jylb+']=ltrim(sum(case jylb when '''+jylb+''' then hgs else 0 end))',
    @sql2=@sql2+',['+jylb+']=case sum(case jylb when '''+jylb+''' then hgs else 0 end) when 0 then ''/'' 
    else left(sum(case jylb when '''+jylb+''' then hgs else 0 end)*1.0/sum(case jylb when '''+jylb+''' then zs else 0 end),3) end'
    from (select distinct jylb from [表])a
    exec(@sql+' from 表 group by yplb with rollup union all '+@sql1+' from 表 group by yplb with rollup union all '+@sql2+' from 表 group by yplb with rollup order by a') --结果:
    a      合计       监督检测         委托检测         仲裁检测
    ------ -------- ------------ ------------ ------------
    合计     监测件数     6            3            2
    合计     合格件数     5            3            2
    合计     合格率      0.8          1.0          1.0
    旅店业    合格率      1.0          1.0          /
    旅店业    合格件数     1            1            0
    旅店业    监测件数     1            1            0
    蒸馏酒    监测件数     5            2            2
    蒸馏酒    合格件数     4            2            2
    蒸馏酒    合格率      0.8          1.0          1.0