这个交叉表统计怎么完成?在线等!

jie_zh 2007-01-13 06:31:39
数据
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列需要保留.
...全文
211 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
marco08 2007-01-13
  • 打赏
  • 举报
回复
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 '王五', '北京分部', '冲销发票', 2500

SELECT
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)
xluzhong 2007-01-13
  • 打赏
  • 举报
回复
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 '王五','北京分部','冲销发票',2500



select 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

vovo2000 2007-01-13
  • 打赏
  • 举报
回复
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
xluzhong 2007-01-13
  • 打赏
  • 举报
回复
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
xluzhong 2007-01-13
  • 打赏
  • 举报
回复
示例
下面的示例将 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

wwh999 2007-01-13
  • 打赏
  • 举报
回复
上面的汇总已经做了啊?你要什么样的结果,贴个格式出来。
mlb2729 2007-01-13
  • 打赏
  • 举报
回复
沙發.......

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧