if OBJECT_ID('tb') is not null drop table tb
go
create table tb(dn varchar(10), gt5n varchar(10),bl float)insert tb
select '男', '上装', 72 union all
select '女', '上装', 80 union all
select '男', '下装', 41 union all
select '女', '下装', 47select * from tb
/*
男 上装 72
女 上装 80
男 下装 41
女 下装 47
*/--我想得到下列结果,男女的上下装各占男女总数比例
/*
女 上装 80 62.99
女 下装 47 37.01
小计 127 100.00
男 上装 72 63.72
男 下装 41 36.28
小计 113 100.00如果可以再算出男女各占总数多少更好,像下面这样:女 上装 80 62.99
女 下装 47 37.01
小计 127 100.00
总计占比 52.92
男 上装 72 63.72
男 下装 41 36.28
小计 113 100.00
总计占比 47.08*/
go
create table tb(dn varchar(10), gt5n varchar(10),bl float)insert tb
select '男', '上装', 72 union all
select '女', '上装', 80 union all
select '男', '下装', 41 union all
select '女', '下装', 47
select isnull(dn,'总计'),isnull(gt5n,'合计'),SUM(bl) as bl
from tb group by dn,gt5n with rollup
/*
(无列名) (无列名) bl
男 上装 72
男 下装 41
男 合计 113
女 上装 80
女 下装 47
女 合计 127
总计 合计 240
*?比例是怎么算的!
cast(SUM(bl)/(select SUM(bl) from tb where dn=a.dn)*100 as varchar)+'%'
from tb a group by dn,gt5n with rollup
/*
(无列名) (无列名) bl (无列名)
男 上装 72 63.7168%
男 下装 41 36.2832%
男 合计 113 100%
女 上装 80 62.9921%
女 下装 47 37.0079%
女 合计 127 100%
总计 合计 240 NULL
*?这样吗?
go
create table tb(dn varchar(10), gt5n varchar(10),bl float)insert tb
select '男', '上装', 72 union all
select '女', '上装', 80 union all
select '男', '下装', 41 union all
select '女', '下装', 47select *
from(
select isnull(dn,'总计') as 性别,isnull(gt5n,'合计') as 类别,SUM(bl) as bl,
cast(SUM(bl)/(select SUM(bl) from tb where dn=a.dn)*100 as varchar)+'%' as 比例,p=1
from tb a group by dn,gt5n with rollup having(GROUPING(dn)=0)
union all
select dn+'占总比例','',0,cast(SUM(bl)/(select SUM(bl) from tb)*100 as varchar)+'%',p=2 from tb a group by dn
)aa
order by 性别,p
/*
性别 类别 bl 比例 p
男 上装 72 63.7168% 1
男 下装 41 36.2832% 1
男 合计 113 100% 1
男占总比例 0 47.0833% 2
女 上装 80 62.9921% 1
女 下装 47 37.0079% 1
女 合计 127 100% 1
女占总比例 0 52.9167% 2
*/
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-25 16:40:11.437●●●●●
★★★★★soft_wsx★★★★★
*/
if OBJECT_ID('tb') is not null drop table tb
go
create table tb(dn varchar(10), gt5n varchar(10),bl float)insert tb
select '男', '上装', 72 union all
select '女', '上装', 80 union all
select '男', '下装', 41 union all
select '女', '下装', 47select 性别,类别,bl 数量,比例
from(
select isnull(dn,'总计') as 性别,isnull(gt5n,'合计') as 类别,SUM(bl) as bl,
cast(cast(SUM(bl)/(select SUM(bl) from tb where dn=a.dn)*100 as decimal(14,2)) as varchar)+'%' as 比例,p=1
from tb a group by dn,gt5n with rollup having(GROUPING(dn)=0)
union all
select dn+'占总比例','',0,cast(cast(SUM(bl)/(select SUM(bl) from tb)*100 as decimal(14,2)) as varchar)+'%',
p=2 from tb a group by dn
)aa
order by 性别,p
/*
性别 类别 数量 比例
男 上装 72 63.72%
男 下装 41 36.28%
男 合计 113 100.00%
男占总比例 0 47.08%
女 上装 80 62.99%
女 下装 47 37.01%
女 合计 127 100.00%
女占总比例 0 52.92%
*/完整方案!p用来排序!
go
create table tb(dn varchar(10), gt5n varchar(10),bl float)insert tb
select '男', '上装', 72 union all
select '女', '上装', 80 union all
select '男', '下装', 41 union all
select '女', '下装', 47select dn ,case when (gt5n is null and dn is not null) then '小计' else gt5n end gt5n ,sl ,bl=cast(sl/(select sum(bl) from tb where dn=t.dn )*100 as decimal(10,2))
from (
select dn,gt5n,sum(bl)sl from tb group by dn,gt5n WITH ROLLUP) as t