我想实现这样得效果
表 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
表 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
'检测件数' 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这样写,合计算出来是错误的,我哪里写错了,?
不管别的 case 都错了
[鉴定检测]=max(CASE jylb WHEN jylb='鉴定检测' THEN zs ELSE '0' END )
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 行受影响)*/
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