SQL如何实现这样的连接?
现在有两张表
计划表
业务员存货计划金额
张三A1000
李四A2000
实际表
业务员存货实际金额
张三A900
张三B800
要出这样的一张分析报表 怎么实现?
业务员存货实际金额计划金额计划完成率
张三A100090090%
张三B800
李四A2000
合计3000170056.67%
[解决办法]
/*现在有两张表计划表业务员 存货 计划金额张三 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*/
[解决办法]
--借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*/