数据
         EmpName BranchName BillType      AllTold
admin 昆明分部 报销支付单 1000
admin 昆明分部 报销支付单 200
李四 昆明分部 报销支付单 100
李四 昆明分部 报销支付单 8000
李四 昆明分部 报销支付单 2000
李四 昆明分部 报销支付单 100
admin 昆明分部 报销支付单 111
李四 昆明分部 报销支付单 23000
李四 昆明分部 报销支付单 200
李四 昆明分部 报销支付单 2000
李四 昆明分部 冲销发票          5000
王五 北京分部 报销支付单 1000
王五 北京分部 报销支付单 2000
王五 北京分部 冲销发票          2500
我想要的结果
         EmpName BranchName 报销支付单  冲销发票  余额
王五 北京分部  3000      2500     500
         小计                3000         2500    500
admin 昆明分部  1311         0    1311
李四 昆明分部 35400      5000   30400
         小计               36711         5000  31711
         总计               39711         7500  32211
没有小计,总计的交叉表我已经做出来了
SELECT empname,branchname,
[报销支付单]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) ,
[冲销发票]=sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END),
[余额]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) - sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END)
FROM exoperbill
GROUP BY empname,branchname
结果:
王五 北京分部 3000 2500 500
admin 昆明分部 1311 0 1311
李四 昆明分部 35400 5000 30400
但怎么再按照branchname来分组统计呢?empname列需要保留.

解决方案 »

  1.   

    示例
    下面的示例将 royalty 的数值分组,并聚合 advance 的数值。GROUPING 函数应用于 royalty 列。USE pubs
    SELECT royalty, SUM(advance) 'total advance', 
       GROUPING(royalty) 'grp'
       FROM titles
       GROUP BY royalty WITH ROLLUP结果集在 royalty 下显示两个空值。第一个 NULL 代表从表中这一列得到的空值组。第二个 NULL 在 ROLLUP 操作所添加的汇总行中。汇总行显示的是所有 royalty 组的 advance 合计数值,并且在 grp 列中用 1 标识。下面是结果集:royalty        total advance              grp 
    ---------      ---------------------    ---
    NULL           NULL                     0  
    10             57000.0000               0  
    12             2275.0000                0  
    14             4000.0000                0  
    16             7000.0000                0  
    24             25125.0000               0  
    NULL           95400.0000               1  
      

  2.   

    SELECT empname,branchname,
    [报销支付单]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) ,
    [冲销发票]=sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END),
    [余额]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) - sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END)
    FROM exoperbill
    GROUP BY empname,branchname with rollup
      

  3.   

    SELECT 
    empname = case when grouping(empname) = 1 then '小计' else empname end ,
    branchname = case when grouping(branchname) = 1 then '总计' else branchname end ,
    [报销支付单]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) ,
    [冲销发票]=sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END),
    [余额]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) - sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END)
    FROM exoperbill
    GROUP BY branchname, empname
    with rollup
      

  4.   

    create table exoperbill(EmpName varchar(10), BranchName varchar(100), BillType varchar(20),AllTold int)
    insert into exoperbill 
    select 'admin','昆明分部','报销支付单',1000 union all
    select 'admin','昆明分部','报销支付单',200 union all
    select '李四','昆明分部','报销支付单',100 union all
    select '李四','昆明分部','报销支付单',8000 union all
    select '李四','昆明分部','报销支付单',2000 union all
    select '李四','昆明分部','报销支付单',100 union all
    select 'admin','昆明分部','报销支付单',111 union all
    select '李四','昆明分部','报销支付单',23000 union all
    select '李四','昆明分部','报销支付单',200 union all
    select '李四','昆明分部','报销支付单',2000 union all
    select '李四','昆明分部','冲销发票',5000 union all
    select '王五','北京分部','报销支付单',1000 union all
    select '王五','北京分部','报销支付单',2000 union all
    select '王五','北京分部','冲销发票',2500select case when flag = 1 then '小计' else isnull(empname,'总计') end,
    isnull(branchname,''),[报销支付单],[冲销发票],[余额]
    from(
    SELECT empname,branchname,
    [报销支付单]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) ,
    [冲销发票]=sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END),
    [余额]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) - sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END)
    ,grouping(branchname) as flag 
    FROM exoperbill
    GROUP BY empname,branchname with rollup)t--结果:
    --王五北京分部30002500500
    --admin昆明分部131101311
    --李四昆明分部35400500030400
    --但怎么再按照branchname来分组统计呢?empname列需要保留.
    drop table exoperbill
      

  5.   

    create table exoperbill(EmpName nvarchar(20), BranchName nvarchar(20), BillType nvarchar(20), AllTold int)
    insert exoperbill select 'admin', '昆明分部', '报销支付单', 1000
    union all select  'admin', '昆明分部', '报销支付单', 200
    union all select  '李四', '昆明分部', '报销支付单', 100
    union all select  '李四', '昆明分部', '报销支付单', 8000
    union all select  '李四', '昆明分部', '报销支付单', 2000
    union all select  '李四', '昆明分部', '报销支付单', 100
    union all select  'admin', '昆明分部', '报销支付单', 111
    union all select  '李四', '昆明分部', '报销支付单', 23000
    union all select  '李四', '昆明分部', '报销支付单', 200
    union all select  '李四', '昆明分部', '报销支付单', 2000
    union all select  '李四', '昆明分部', '冲销发票',          5000
    union all select  '王五', '北京分部', '报销支付单', 1000
    union all select  '王五', '北京分部', '报销支付单', 2000
    union all select  '王五', '北京分部', '冲销发票',          2500SELECT 
    case when grouping(empname)=1 then '' else empname end as empname,case when grouping(empname)=0 then branchname 
     when grouping(branchname)=1 then '合计' else '小计' end as branchname,[报销支付单]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) ,
    [冲销发票]=sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END),
    [余额]=sum(CASE billtype WHEN '报销支付单' THEN alltold ELSE 0 END) - sum(CASE billtype WHEN '冲销发票' THEN alltold ELSE 0 END)
    FROM exoperbill
    GROUP BY branchname, empname with rollup
    --result
    empname              branchname           报销支付单       冲销发票        余额          
    -------------------- -------------------- ----------- ----------- ----------- 
    王五                   北京分部                 3000        2500        500
                         小计                   3000        2500        500
    admin                昆明分部                 1311        0           1311
    李四                   昆明分部                 35400       5000        30400
                         小计                   36711       5000        31711
                         合计                   39711       7500        32211(6 row(s) affected)