客户 大类 数量 金额
张三 冬装 2        34
李四 冬装 23        90
王五 夏装 8        189
刘六 夏装 3          422一个大概这个样的记录表,要按大类分类汇总,并有一列计算每个客户在自己所属大类里的占比,要实现结果如下:客户 大类     数量 金额 大类占比
张三 冬装     2        34             27%
李四 冬装     23     90             73%
小计 冬装小计   25        124             17%
王五 夏装    8        189             31%
刘六 夏装    3         422             69%
小计 夏装小计   11   611             83%
合计 合计    36         735             100%就是张三客户的大类占比等于张三的金额除冬装小计金额
王五客户的大类占比等于王五的金额除夏装小计金额
冬装小计的大类占比等于冬装小计的的金额合计的金额分类汇总没有问题,但怎么求分类占比,求解!

解决方案 »

  1.   

    IF Object_ID('table1') IS NOT NULL
      DROP TABLE table1
    GO
    CREATE TABLE table1 (客户 nvarchar(2), 大类 nvarchar(2), 数量 int, 金额 int)
    GO
    INSERT INTO table1
    SELECT N'张三',N'冬装',2,34 UNION ALL
    SELECT N'李四',N'冬装',23,90 UNION ALL
    SELECT N'王五',N'夏装',8,189 UNION ALL
    SELECT N'刘六',N'夏装',3,422--SELECT * FROM table1
    GOWITH T (客户, 大类, 数量, 金额, g1, g2)
    AS (SELECT 客户, 大类, SUM(数量) AS 数量,SUM(金额) AS 金额,
               GROUPING(客户) g1,
               GROUPING(大类) g2
          FROM table1
      GROUP BY 大类,客户 WITH ROLLUP
    )
    SELECT 客户, 大类, 数量, 金额,
           CASE WHEN (g1=0) THEN
                    ROUND(Convert(real,金额)/(SELECT AVG(金额)
                                                FROM T T1
                                               WHERE T1.大类=T.大类
                                                 AND T1.g1 = 1
                                                 AND T1.g2 = 0)
                         ,2)
                WHEN (g1=1 AND g2=0) THEN
                    ROUND(Convert(real,金额)/(SELECT AVG(金额)
                                                FROM T T2
                                               WHERE T2.g1 = 1
                                                 AND T2.g2 = 1)
                         ,2)
                ELSE
                    1.0
           END 大类占比
      FROM T
    客户 大类        数量        金额               大类占比
    ---- ---- ----------- ----------- ----------------------
    王五 夏装           8         189                   0.31
    刘六 夏装           3         422                   0.69
    NULL 夏装          11         611                   0.83
    李四 冬装          23          90                   0.73
    张三 冬装           2          34                   0.27
    NULL 冬装          25         124                   0.17
    NULL NULL          36         735                      1