现在有两张表
计划表
业务员 存货 计划金额
张三 A 1000
李四 A 2000
实际表
业务员 存货 实际金额
张三 A 900
张三 B 800
要出这样的一张分析报表 怎么实现?
业务员 存货 实际金额 计划金额 计划完成率
张三 A 1000 900 90%
张三 B 800
李四 A 2000
合计 3000 1700 56.67%
------解决方案--------------------
- SQL code
/*现在有两张表计划表业务员 存货 计划金额张三 A 1000李四 A 2000实际表业务员 存货 实际金额张三 A 900张三 B 800要出这样的一张分析报表 怎么实现?业务员 存货 实际金额 计划金额 计划完成率张三 A 1000 900 90%张三 B 800李四 A 2000合计 3000 1700 56.67% */declare @计划表 table (业务员 varchar(20),存货 varchar(20),计划金额 float)insert @计划表 select '张三','A',1000 Union ALL select '李四','A',2000declare @实际表 table (业务员 varchar(20),存货 varchar(20),实际金额 float)insert @实际表 select '张三','A',900 Union ALL select '张三','B',800select case when 业务员 is NULL then '合计' else 业务员 end 业务员 ,case when 存货 is NULL then '' else 存货 end 存货 ,实际金额 ,计划金额 ,ISNULL(计划完成率,0) 计划完成率from ( select 业务员 ,存货 ,sum(实际金额) 实际金额 ,sum(计划金额) 计划金额 ,round(100*sum(实际金额)/NULLIF(sum(计划金额),0),2) 计划完成率,GROUPING(业务员) n from ( select a.业务员,a.存货,a.计划金额,0 实际金额 from @计划表 a UNION all select b.业务员,b.存货,0 计划金额,b.实际金额 from @实际表 b ) c group by 业务员,存货 with rollup ) bwhere 存货 is not NULL or n=1/*业务员 存货 实际金额 计划金额 计划完成率李四 A 0 2000 0张三 A 900 1000 90张三 B 800 0 0合计 1700 3000 56.67*/
------解决方案--------------------
- SQL code
--借1楼思路declare @计划表 table (业务员 varchar(20),存货 varchar(20),计划金额 float)insert @计划表 select '张三','A',1000 Union ALL select '李四','A',2000declare @实际表 table (业务员 varchar(20),存货 varchar(20),实际金额 float)insert @实际表 select '张三','A',900 Union ALL select '张三','B',800select case when 业务员 is NULL then '合计' else 业务员 end 业务员, case when 存货 is NULL then '' else 存货 end 存货, ISNULL(实际金额,0) 实际金额, ISNULL(计划金额,0) 计划金额, ISNULL(ROUND(计划完成率,2),0) 计划完成率from ( select a.业务员, a.存货, sum(s.实际金额) 实际金额, sum(p.计划金额)计划金额, sum(s.实际金额)/sum(p.计划金额) as 计划完成率, grouping(a.业务员) n from (( select 业务员,存货 from @计划表 union select 业务员,存货 from @实际表 ) a left join @计划表 p on a.业务员=p.业务员 and a.存货=p.存货 ) left join @实际表 s on a.业务员=s.业务员 and a.存货=s.存货 group by a.业务员,a.存货 with rollup ) aa where 存货 is not NULL or n=1/*业务员 存货 实际金额 计划金额 计划完成率李四 A 0 2000 0张三 A 900 1000 0.9张三 B 800 0 0合计 1700 3000 0.57*/