读书人

【关于两表汇总统计各个数量的报表有关

发布时间: 2012-09-08 10:48:07 作者: rapoo

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

SQL code
A表主键,部门,等级,是否操作A产品(1操作0否),是否操作B产品(1操作0否),是否操作C产品(1操作0否),店名,人员AID,BM,Class,IsAType,IsBType,IsCtype,AName,Person1,'部门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表IDBID,FJName,AIDs1,'a',12,'b',13,'c',24,'d',35,'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


4 王五 2007 5 0 0 4

(4 行受影响)
[解决办法]

SQL code
--大版的blog2005的行列转换: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 @sqlset @sql='select 编号,人员,年份,月份,'+@sql+'from (select 编号,人员,年份,月份,原因,Ordersfrom taunpivot(orders for [原因] in([1号],[2号],[3号],[4号]))as tb )tmppivot(count(原因) for Orders in('+@sql+'))tmp2'--print @sqlexec(@sql)编号          人员    年份          月份          迟到          事假          正常----------- ----- ----------- ----------- ----------- ----------- -----------1           张三    2006        1           2           1           12           张三    2006        2           1           1           23           李四    2006        3           0           0           44           王五    2007        5           0           0           4(4 行受影响) 

读书人网 >SQL Server

热点推荐