# 无规律自定义分段的分类汇总+交叉表处理

--测试数据
create table tb(编号 int,性质 varchar(10),数量 int,指标1 decimal(10,1),指标2 decimal)
insert tb select 1 ,'00' ,10,1.1 ,10
union all select 2 ,'01' ,20,1.2 ,20
union all select 3 ,'00' ,30,1.5 ,10
union all select 4 ,'01' ,40,1.9 ,35
union all select 5 ,'00' ,40,1.2 ,20

/*--处理要求

a                      范围               性质（00）         性质（01）
----------------- ---------------- -------------- --------------

1.0-1.29        .63            .63
1.3-1.59        .38            .38
1.9-1.99        .00            .00
>=2               .00            .00

10-31            1.00           1.00
31-50            .00            .00
>=50             .00            .00

------------------------------------------------------------------

范围            性质（00）                               性质（01）

1.0-1.29      (10+40)/(10+30+40)                 20/(20+40)
1.3-1.59      30/(10+30+40)                            0
1.6-1.99      0                                                    40/(20+40)
>=2              0                                                    0

10-30            (10+30+40)/(10+30+40)          20/(20+40)
31-50            0                                                    40/(20+40)
>=50            0                                                    0

--*/

go

--查询处理
select a,范围,[性质（00）],[性质（01）]
from(
select
a=case a.id when 1 then '指标1' when 21 then '指标2' else '' end,
范围=a.lb,
[性质（00）]=cast(case when b.a>0 then isnull(a.a*1./b.a,0) else 0 end as decimal(10,2)),
[性质（01）]=cast(case when b.a>0 then isnull(a.a*1./b.a,0) else 0 end as decimal(10,2)),
a.id
from(
select b.id,b.lb,
a=sum(case a.性质 when '00' then a.数量 end),
b=sum(case a.性质 when '01' then a.数量 end)
from tb a
right join(
select id=1,lb='<1.0'    ,a=null,b=1.0  union all
select id=2,lb='1.0-1.29',a=1.0 ,b=1.3  union all
select id=3,lb='1.3-1.59',a=1.3 ,b=1.9  union all
select id=4,lb='1.9-1.99',a=1.9 ,b=2.0  union all
select id=5,lb='>=2'     ,a=2.0 ,b=null
)b on a.指标1>=isnull(b.a,a.指标1)
and a.指标1<isnull(b.b,a.指标1-1)
group by b.id,b.lb
union all
select b.id,b.lb,
a=sum(case a.性质 when '00' then a.数量 end),
b=sum(case a.性质 when '01' then a.数量 end)
from tb a right join(
select id=21,lb='<10'  ,a=null,b=10  union all
select id=22,lb='10-31',a=10  ,b=31  union all
select id=23,lb='31-50',a=31  ,b=51  union all
select id=25,lb='>=50' ,a=50  ,b=null
)b on a.指标2>=isnull(b.a,a.指标2)
and a.指标2<isnull(b.b,a.指标2-1)
group by b.id,b.lb
)a,(
select
a=isnull(sum(case 性质 when '00' then 数量 end),0),
b=isnull(sum(case 性质 when '01' then 数量 end),0)
from tb
)b
union all
select '指标1平均值','',
cast(isnull(
case
when count(case 性质 when '00' then 性质 end)>0
then sum(case 性质 when '00' then 指标1 end)
*1./count(case 性质 when '00' then 性质 end)
else 0
end,0) as decimal(10,2)),
cast(isnull(
case
when count(case 性质 when '01' then 性质 end)>0
then sum(case 性质 when '01' then 指标1 end)
*1./count(case 性质 when '01' then 性质 end)
else 0
end,0) as decimal(10,2)),
id=6
from tb
union all
select '指标2平均值','',
cast(isnull(
case
when count(case 性质 when '00' then 性质 end)>0
then sum(case 性质 when '00' then 指标2 end)
*1./count(case 性质 when '00' then 性质 end)
else 0
end,0) as decimal(10,2)),
cast(isnull(
case
when count(case 性质 when '01' then 性质 end)>0
then sum(case 性质 when '01' then 指标2 end)
*1./count(case 性质 when '01' then 性质 end)
else 0
end,0) as decimal(10,2)),
id=26
from tb
union all
select '数量合计：','',
isnull(sum(case 性质 when '00' then 数量 end),0),
isnull(sum(case 性质 when '01' then 数量 end),0),
id=30
from tb
)a order by id
go

--删除测试
drop table tb

• 本文已收录于以下专栏：

## 无规律自定义分段的分类汇总+交叉表处理

• zgqtxwd
• 2008年04月26日 13:57
• 113

## 无规律自定义分段的分类汇总+交叉表处理

/*--原帖地址:http://community.csdn.net/Expert/topic/3845/3845290.xml?temp=.3689386--*/--测试数据create table...
• zhaowei001
• 2008年01月03日 15:06
• 179

## 交叉表处理

--测试数据create table 表(id int,proc1 decimal(20,1),proc2 decimal(20,1),proc3 decimal(20,1))insert 表 sel...
• wlinglong
• 2006年12月29日 17:39
• 435

## mysql分段数据汇总

CREATE TABLE ljbb.Untitled ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) CHARA...
• buyueliuying
• 2018年01月09日 10:24
• 100

## 使用sql语句进行数据分类汇总

• paulchenbo
• 2007年10月17日 13:25
• 528

## SQL SERVER的分类汇总

SQL SERVER的分类汇总SQL SERVER中使用GROUP BY对数据进行分类汇总，我们也可以使用WITH ROLLUP和WITH CUBE配合GROUP BY进行“增强”了的分类汇总，那么他...
• misterliwei
• 2010年01月13日 16:44
• 6390

## MySQL常用命令分类汇总

• zhangshouming
• 2015年02月04日 00:30
• 993

## mysql中实现分类汇总功能

1.创建测试表： CREATE TABLE test_ROLLUP_1 ( StateCode CHAR(6), DepCode CHAR(6), SendMoney INT )...
• Birds_Cerebrum
• 2017年06月22日 22:08
• 1755

## 水晶报表交叉报表多个汇总横向显示

• woaizhoulichao1
• 2011年10月27日 10:10
• 989

## SQL分类汇总

DECLARE @t TABLE(Groups char(2),Item varchar(10),Color varchar(10),Quantity int)INSERT @t SELECT aa,...
• htl258
• 2009年03月22日 17:50
• 2181

举报原因： 您举报文章：无规律自定义分段的分类汇总+交叉表处理 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)