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*/

解决方案 »

  1.   

    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 '女', '下装',    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
    *?比例是怎么算的!
      

  2.   

    select isnull(dn,'总计'),isnull(gt5n,'合计'),SUM(bl) as bl,
             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
    *?这样吗?
      

  3.   

    http://blog.csdn.net/fredrickhu/archive/2009/09/24/4587789.aspx合计小计的问题
      

  4.   

    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(
     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
    */
      

  5.   

    /*
    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用来排序!
      

  6.   

    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 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