原表:
公司        类别      产品      数量     
 gs1         lb1      cp1        10
 gs1         lb1      cp2        10
 gs1         lb2      cp3        10
 gs1         lb2      cp4        10
 gs2         lb1      cp5        10
 gs2         lb1      cp6        10
 gs2         lb2      cp7        10
 gs2         lb2      cp8        10要求:   
公司        类别         产品         数量     
 gs1         lb1         cp1           10
 gs1         lb1         cp2           10
 gs1         lb1小计                   20
 gs1         lb2         cp3           10
 gs1         lb2         cp4           10
 gs1         lb2小计                   20
 gs1合计                               40
 gs2         lb1         cp5           10
 gs2         lb1         cp6           10
 gs2         lb1小计                   20
 gs2         lb2         cp7           10
 gs2         lb2         cp8           10
 gs2         lb2小计                   20
 gs2合计                               40
 总计                                  80
请各位高手指点。

解决方案 »

  1.   

    Select 
    (Case When Grouping(公司) = 0 And Grouping(产品) = 1 And Grouping(类别) = 1 Then 公司 + N'合计' 
    When Grouping(公司) = 1 And Grouping(产品) = 1 And Grouping(类别) = 1 Then N'合计' 
    Else 公司
    End) As 公司,
    (Case When Grouping(产品) = 1 And Grouping(类别) = 0 Then 类别 + N'小计' Else 类别 End) As 类别,
    产品,
    SUM(数量) As 数量
    From TEST
    Group By 公司, 类别, 产品
    With Rollup
      

  2.   

    Create Table TEST
    (公司 Varchar(10),
     类别 Varchar(10),
     产品 Varchar(10),
     数量      Int)Insert TEST Select  'gs1',        'lb1',      'cp1',        10
    Union All Select  'gs1',        'lb1',      'cp2',        10
    Union All Select  'gs1',        'lb2',      'cp3',        10
    Union All Select  'gs1',        'lb2',      'cp4',        10
    Union All Select  'gs2',        'lb1',      'cp5',        10
    Union All Select  'gs2',        'lb1',      'cp6',        10
    Union All Select  'gs2',        'lb2',      'cp7',        10
    Union All Select  'gs2',        'lb2',      'cp8',        10
    GO
    Select 
    (Case When Grouping(公司) = 0 And Grouping(产品) = 1 And Grouping(类别) = 1 Then 公司 + N'合计' 
    When Grouping(公司) = 1 And Grouping(产品) = 1 And Grouping(类别) = 1 Then N'合计' 
    Else 公司
    End) As 公司,
    (Case When Grouping(产品) = 1 And Grouping(类别) = 0 Then 类别 + N'小计' Else 类别 End) As 类别,
    产品,
    SUM(数量) As 数量
    From TEST
    Group By 公司, 类别, 产品
    With Rollup
    Go
    Drop Table TEST
    --Result
    /*
    公司 类别 产品 数量
    gs1 lb1 cp1 10
    gs1 lb1 cp2 10
    gs1 lb1小计 NULL 20
    gs1 lb2 cp3 10
    gs1 lb2 cp4 10
    gs1 lb2小计 NULL 20
    gs1合计 NULL NULL 40
    gs2 lb1 cp5 10
    gs2 lb1 cp6 10
    gs2 lb1小计 NULL 20
    gs2 lb2 cp7 10
    gs2 lb2 cp8 10
    gs2 lb2小计 NULL 20
    gs2合计 NULL NULL 40
    合计 NULL NULL 80
    */
      

  3.   

    CREATE TABLE A
    (
    公司 VARCHAR(10),
    类别 VARCHAR(10),
    产品 VARCHAR(10),
    数量 INT
    )
    INSERT INTO A
    SELECT 'gs1','lb1','cp1',10 UNION ALL 
    SELECT 'gs1','lb1','cp2',10 UNION ALL                         
    SELECT 'gs1','lb2','cp3',10 UNION ALL 
    SELECT 'gs1','lb2','cp4',10 UNION ALL    
    SELECT 'gs2','lb1','cp5',10 UNION ALL 
    SELECT 'gs2','lb1','cp6',10 UNION ALL  
    SELECT 'gs2','lb2','cp7',10 UNION ALL 
    SELECT 'gs2','lb2','cp8',10 
    SELECT * FROM 
    (
    SELECT 公司,类别,产品,数量 FROM A UNION ALL
    SELECT 公司,类别,'小计' 产品,SUM(数量) 数量 FROM A GROUP BY 公司,类别 UNION ALL
    SELECT 公司,'合计' 类别,'' 产品,SUM(数量) 数量 FROM A GROUP BY 公司 UNION ALL
    SELECT '总计' 公司,'' 类别,'' 产品,SUM(数量) 数量 FROM A
    ) B
    ORDER BY 公司,类别,产品
    --
    公司         类别         产品         数量
    ---------- ---------- ---------- -----------
    gs1        lb1        cp1        10
    gs1        lb1        cp2        10
    gs1        lb1        小计         20
    gs1        lb2        cp3        10
    gs1        lb2        cp4        10
    gs1        lb2        小计         20
    gs1        合计                    40
    gs2        lb1        cp5        10
    gs2        lb1        cp6        10
    gs2        lb1        小计         20
    gs2        lb2        cp7        10
    gs2        lb2        cp8        10
    gs2        lb2        小计         20
    gs2        合计                    40
    总计                               80(15 行受影响)
      

  4.   

    如果用 With Rollup
    可以不要总计那一行吗?
    就是得到这种结果:
    ---------------------
    公司        类别         产品         数量     
     gs1         lb1         cp1           10
     gs1         lb1         cp2           10
     gs1         lb1小计                   20
     gs1         lb2         cp3           10
     gs1         lb2         cp4           10
     gs1         lb2小计                   20
     gs1合计                               40
     gs2         lb1         cp5           10
     gs2         lb1         cp6           10
     gs2         lb1小计                   20
     gs2         lb2         cp7           10
     gs2         lb2         cp8           10
     gs2         lb2小计                   20
     gs2合计                               40
      

  5.   

    可以
    Create Table TEST
    (公司 Varchar(10),
     类别 Varchar(10),
     产品 Varchar(10),
     数量     Int)Insert TEST Select  'gs1',        'lb1',      'cp1',        10
    Union All Select  'gs1',        'lb1',      'cp2',        10
    Union All Select  'gs1',        'lb2',      'cp3',        10
    Union All Select  'gs1',        'lb2',      'cp4',        10
    Union All Select  'gs2',        'lb1',      'cp5',        10
    Union All Select  'gs2',        'lb1',      'cp6',        10
    Union All Select  'gs2',        'lb2',      'cp7',        10
    Union All Select  'gs2',        'lb2',      'cp8',        10
    GO
    Select 
    (Case When Grouping(产品) = 1 And Grouping(类别) = 1 Then 公司 + N'合计' Else 公司 End) As 公司,
    (Case When Grouping(产品) = 1 And Grouping(类别) = 0 Then 类别 + N'小计' Else 类别 End) As 类别,
    产品,
    SUM(数量) As 数量
    From TEST
    Group By 公司, 类别, 产品
    With Rollup
    Having 公司 is Not Null
    Go
    Drop Table TEST
    --Result
    /*
    公司 类别 产品 数量
    gs1 lb1 cp1 10
    gs1 lb1 cp2 10
    gs1 lb1小计 NULL 20
    gs1 lb2 cp3 10
    gs1 lb2 cp4 10
    gs1 lb2小计 NULL 20
    gs1合计 NULL NULL 40
    gs2 lb1 cp5 10
    gs2 lb1 cp6 10
    gs2 lb1小计 NULL 20
    gs2 lb2 cp7 10
    gs2 lb2 cp8 10
    gs2 lb2小计 NULL 20
    gs2合计 NULL NULL 40
    */