日期:2014-05-18  浏览次数:20590 次

【关于两表汇总统计各个数量的报表问题】
SQL code

A表

主键,部门,等级,是否操作A产品(1操作0否),是否操作B产品(1操作0否),是否操作C产品(1操作0否),店名,人员
AID,BM,Class,IsAType,IsBType,IsCtype,AName,Person
1,'部门A','A',1,0,1,'temp1','ABC'
2,'部门A','B',1,1,1,'temp2','ABC'
3,'部门A','A',0,0,1,'temp3','BCD'
4,'部门B','C',0,1,1,'temp4','CDE'
5,'部门C','C',0,1,1,'temp5','DEF'
6,'部门D','D',1,0,0,'temp6','FGH'

B表

主键,附件名称,A表ID
BID,FJName,AIDs
1,'a',1
2,'b',1
3,'c',2
4,'d',3
5,'e',6

现在要根据这两个表统计,按照部门,等级,人员,操作产品的附件上传信息汇总
最后出来的效果就是

部门,人员,产品,A级数量,A级以上传附件数量,B级数量,B级以上传附件数量,C级数量,C级以上传附件数量,D级数量,D级以上传附件数量,合计等级数量,合计以上传附件数量
'部门A','ABC',A,1,1,0,0,0,0,0,0,1,1
'部门A','ABC',B,0,0,1,1,0,0,0,0,1,1
'部门A','ABC',C,1,1,0,0,1,1,0,0,2,2

报表就是这样,最后根据部门,人员,操作产品,统计每个等级的店数量,已经上传附件的店数量(同一店上传多张算一张,只计算是否上传,同时如果该店操作多个产品A,B,C都操作,但是只要上传一张,即所有A,B,C产品都算上传过。)



------解决方案--------------------
行列转换,苦力活

到精华帖找找
------解决方案--------------------
http://blog.csdn.net/roy_88/article/details/1509413

参考一下大版的博客啥
------解决方案--------------------
参考一下吧:

create table ta(编号 int,人员 varchar(5), 年份 int,月份 int ,[1号] varchar(5), [2号] varchar(5),[3号] varchar(5),[4号] varchar(5))
insert ta select 1, '张三',2006, 1, '正常', '迟到', '迟到', '事假'
union all select 2, '张三', 2006, 2, '迟到', '事假', '正常', '正常'
union all select 3, '李四', 2006, 3, '正常', '正常', '正常', '正常'
union all select 4, '王五', 2007, 5, '正常', '正常','正常', '正常'

2005的列转行再行转列:
declare @sql varchar(4000)
select @sql=isnull(@sql+',','')+quotename(Orders)
from ta 
unpivot
(orders for [原因] in([1号],[2号],[3号],[4号])
)as tb group by Orders
--print @sql
set @sql='select 编号,人员,年份,月份,'+@sql+
'from (
select 编号,人员,年份,月份,原因,Orders
from ta
unpivot
(orders for [原因] in([1号],[2号],[3号],[4号])
)as tb 
)tmp
pivot
(count(原因) for Orders in('+@sql+')
)tmp2'
--print @sql
exec(@sql)

编号 人员 年份 月份 迟到 事假 正常
----------- ----- ----------- ----------- ----------- ----------- -----------
1 张三 2006 1 2 1 1
2 张三 2006 2 1 1 2
3 李四 2006 3 0 0 4
4 王五 2007 5 0 0 4

(4 行受影响)
------解决方案--------------------
参考一下吧:

create table ta(编号 int,人员 varchar(5), 年份 int,月份 int ,[1号] varchar(5), [2号] varchar(5),[3号] varchar(5),[4号] varchar(5))
insert ta select 1, '张三',2006, 1, '正常', '迟到', '迟到', '事假'
union all select 2, '张三', 2006, 2, '迟到', '事假', '正常', '正常'
union all select 3, '李四', 2006, 3, '正常', '正常', '正常', '正常'
union all select 4, '王五', 2007, 5, '正常', '正常','正常', '正常'

2005的列转行再行转列:
declare @sql varchar(4000)
select @sql=isnull(@sql+',','')+quotename(Orders)
from ta 
unpivot
(orders for [原因] in([1号],[2号],[3号],[4号])
)as tb group by Orders
--print @sql
set @sql='select 编号,人员,年份,月份,'+@sql+
'from (
select 编号,人员,年份,月份,原因,Orders
from ta
unpivot
(orders for [原因] in([1号],[2号],[3号],[4号])
)as tb 
)tmp
pivot
(count(原因) for Orders in('+@sql+')
)tmp2'
--print @sql
exec(@sql)

编号 人员 年份 月份 迟到 事假 正常
----------- ----- ----------- ----------- ----------- ----------- -----------
1 张三 2006 1 2 1 1
2 张三 2006 2 1 1 2
3 李四 2006 3 0 0 4