--建立测试环境
Create Table 表(客户名称 varchar(10),产品名称 varchar(10),规格 varchar(10),金额 int)
--插入数据
insert into 表
select 'A客户','A名称','A规格','100' union
select 'B客户','A名称','A规格','200' union
select 'A客户','c名称','c规格','100' union
select 'B客户','b名称','b规格','800' union
select 'B客户','d名称','d规格','1000'--测试语句
select *,客户名称 as 排序列 from 表
union
select '合计','','',sum(金额),客户名称 from 表 group by 客户名称
order by 客户名称
 
--删除测试环境
Drop Table 表

解决方案 »

  1.   

    declare @tb table
    (
      客户名称 varchar(20),
      产品名称 varchar(20),
      规格 varchar(20),
      金额 int
    )
    insert @tb
    select 'A客户',       'A名称',      'A规格',    100 union
    select 'B客户',       'A名称',      'A规格',    200 union
    select 'A客户',       'c名称',      'c规格',    100 union
    select 'B客户',       'b名称',      'b规格',    800 union
    select 'B客户',       'd名称',      'd规格',    1000--查询
    select (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '总计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'
           ,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
           ,max(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称
    with rollup
    order by 客户名称,产品名称--结果
    /*
    客户名称                     产品名称                 规格                   金额          
    ------------------------ -------------------- -------------------- ----------- 
    A客户                      A名称                  A规格                  100
    A客户                      c名称                  c规格                  100
    A客户合计                                                              100
    B客户                      A名称                  A规格                  200
    B客户                      b名称                  b规格                  800
    B客户                      d名称                  d规格                  1000
    B客户合计                                                              1000
    总计 
    */
      

  2.   

    declare @tb table
    (
      客户名称 varchar(20),
      产品名称 varchar(20),
      规格 varchar(20),
      金额 int
    )
    insert @tb
    select 'A客户',       'A名称',      'A规格',    100 union
    select 'B客户',       'A名称',      'A规格',    200 union
    select 'A客户',       'c名称',      'c规格',    100 union
    select 'B客户',       'b名称',      'b规格',    800 union
    select 'B客户',       'd名称',      'd规格',    1000--查询
    select (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '总计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'
           ,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
           ,sum(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称
    with rollup
    order by 客户名称,产品名称--结果
    /*
    客户名称                     产品名称                 规格                   金额          
    ------------------------ -------------------- -------------------- ----------- 
    A客户                      A名称                  A规格                  100
    A客户                      c名称                  c规格                  100
    A客户合计                                                              100
    B客户                      A名称                  A规格                  200
    B客户                      b名称                  b规格                  800
    B客户                      d名称                  d规格                  1000
    B客户合计                                                              1000
    总计 
    */
      

  3.   

    declare @tb table
    (
      客户名称 varchar(20),
      产品名称 varchar(20),
      规格 varchar(20),
      金额 int
    )
    insert @tb
    select 'A客户',       'A名称',      'A规格',    100 union
    select 'B客户',       'A名称',      'A规格',    200 union
    select 'A客户',       'c名称',      'c规格',    100 union
    select 'B客户',       'b名称',      'b规格',    800 union
    select 'B客户',       'd名称',      'd规格',    1000--查询
    select (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '总计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'
           ,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
           ,sum(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称
    with rollup
    order by 客户名称,产品名称--结果
    /*
    客户名称                     产品名称                 规格                   金额          
    ------------------------ -------------------- -------------------- ----------- 
    A客户                      A名称                  A规格                  100
    A客户                      c名称                  c规格                  100
    A客户合计                                                              200
    B客户                      A名称                  A规格                  200
    B客户                      b名称                  b规格                  800
    B客户                      d名称                  d规格                  1000
    B客户合计                                                              2000
    总计                                                                 2200
    */
      

  4.   

    谢谢高手解答  非常谢谢  
    客户名称 + 产品名称 + 规格  是唯一的  也就是同一个客户 + 产品名称 + 规格 只有一个金额。 我觉得产品名称和规格应该是同一重要性。 为什么
    (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '总计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'从这里看 他们的重要性不一样呀 ???
      

  5.   

    A客户       A名称      A规格    100
    A客户       A名称      B规格    200
    B客户       A名称      A规格    200
    A客户       c名称      c规格    100
    B客户       b名称      b规格    800
    B客户       d名称      d规格    1000我想统计的结果是(其实就是按客户分类统计)
    A客户       A名称      A规格    100
    A客户       A名称      B规格    200
    A客户       c名称      c规格    100
    合计:                           400
    B客户       A名称      A规格    200
    B客户       b名称      b规格    800
    B客户       d名称      d规格    1000
    合计:                          2000
    总计:                          2400上面的高手写的好像不行的
      

  6.   

    请问  vivianfdlpw() 高手哥哥  如果 按照客户 + 产品名称 + 规格  这样统计该怎么写呀
      

  7.   

    declare @tb table
    (
      客户名称 varchar(20),
      产品名称 varchar(20),
      规格 varchar(20),
      金额 int
    )
    insert @tb
    select 'A客户',       'A名称',      'A规格',    100 union
    select 'A客户',       'B名称',      'B规格',    200 union
    select 'B客户',       'A名称',      'A规格',    200 union
    select 'A客户',       'c名称',      'c规格',    100 union
    select 'B客户',       'b名称',      'b规格',    800 union
    select 'B客户',       'd名称',      'd规格',    1000--查询
    select (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '总计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'
           ,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
           ,sum(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称
    with rollup
    order by 客户名称,产品名称--结果
    /*
    客户名称                     产品名称                 规格                   金额          
    ------------------------ -------------------- -------------------- ----------- 
    A客户                      A名称                  A规格                  100
    A客户                      B名称                  B规格                  200
    A客户                      c名称                  c规格                  100
    A客户合计                                                              400
    B客户                      A名称                  A规格                  200
    B客户                      b名称                  b规格                  800
    B客户                      d名称                  d规格                  1000
    B客户合计                                                              2000
    总计                                                                 2400
    */
      

  8.   

    如果按照三个进行分组,产生的记录比较多,你可以在查询分析器里执行查看--查询
    select 客户名称,产品名称,规格
           ,sum(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称,规格
    with rollup
    order by 客户名称,产品名称,规格
      

  9.   

    使用compute语句不行吗?
    Select 客户名称,产品名称,规格,金额 From table
    Order By 客户名称
    Compute sum(金额) By 客户名称
    Compute sum(金额)
      

  10.   

    To  vivianfdlpw() 
    那按照 :
    A客户       A名称      A规格    100
    A客户       A名称      B规格    200
    B客户       A名称      A规格    200
    A客户       c名称      c规格    100
    B客户       b名称      b规格    800
    B客户       d名称      d规格    1000我想统计的结果是(其实就是按客户分类统计)
    A客户       A名称      A规格    100
    A客户       A名称      B规格    200
    A客户       c名称      c规格    100
    合计:                           400
    B客户       A名称      A规格    200
    B客户       b名称      b规格    800
    B客户       d名称      d规格    1000
    合计:                          2000
    总计:                          2400这样的统计 可以统计出来吗 ?????????
      

  11.   

    A客户       A名称      A规格    100
    A客户       A名称      B规格    200
    A客户       c名称      c规格    100
    合计:                           400
    B客户       A名称      A规格    200
    B客户       b名称      b规格    800
    B客户       d名称      d规格    1000
    合计:                          2000vivianfdlpw() 的语句可以达到以上结果。
      

  12.   

    我试过 vivianfdlpw()  写的 不行的
      

  13.   

    你去看看SqlServer的帮助中关于rollup 的例子。然后你自己就可以写的出这个查询了。
    要知其所以然三,例子讲的很好
      

  14.   


    select (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '合计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'
           ,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
           ,max(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称
    with rollupunion all 
    select '总计','','',sum(金额)  from @tb
      

  15.   

    declare @tb table
    (
      客户名称 varchar(20),
      产品名称 varchar(20),
      规格 varchar(20),
      金额 int
    )
    insert @tb
    select 'A客户',       'A名称',      'A规格',    100 union
    select 'A客户',       'A名称',      'B规格',    200 union
    select 'B客户',       'A名称',      'A规格',    200 union
    select 'A客户',       'c名称',      'c规格',    100 union
    select 'B客户',       'b名称',      'b规格',    800 union
    select 'B客户',       'd名称',      'd规格',    1000--查询
    select (case when grouping(产品名称)=1 and grouping(客户名称)=1 
                 then '总计'
                 when grouping(产品名称)=1
                 then 客户名称+'合计' 
                 else 客户名称 
            end) as '客户名称'
           ,isnull(产品名称,'') as '产品名称'
           ,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
           ,sum(金额) as '金额'
    from @tb t
    group by 客户名称,产品名称
    with rollup
    order by 客户名称,产品名称
    得到的结果是 
    A客户 A名称 B规格 300
    A客户 c名称 c规格 100
    A客户合计 400
    B客户 A名称 A规格 200
    B客户 b名称 b规格 800
    B客户 d名称 d规格 1000
    B客户合计 2000
    总计 2400
    而不是 我要的
    A客户 A名称 A规格 100
    A客户 A名称 B规格 200
    A客户 c名称 c规格 100
    A客户合计 400
    B客户 A名称 A规格 200
    B客户 b名称 b规格 800
    B客户 d名称 d规格 1000
    B客户合计 2000
    总计 2400
      

  16.   

    declare @tb table
    (
      客户名称 varchar(20),
      产品名称 varchar(20),
      规格 varchar(20),
      金额 int
    )
    insert @tb
    select 'A客户',       'A名称',      'A规格',    100 union
    select 'A客户',       'A名称',      'B规格',    200 union
    select 'B客户',       'A名称',      'A规格',    200 union
    select 'A客户',       'c名称',      'c规格',    100 union
    select 'B客户',       'b名称',      'b规格',    800 union
    select 'B客户',       'd名称',      'd规格',    1000
    select * from (select * from @tb
    union all
    select 客户名称+'合计','' as 产品名称,'' as 规格,sum(金额) as 金额  from @tb group by 客户名称
    union all
    select '总计'as 客户名称,'' as 产品名称,'' as 规格,sum(金额)as 金额 from @tb ) T
    order by 客户名称