当前位置: 代码迷 >> 报表 >> SQL怎么实现这样的连接
  详细解决方案

SQL怎么实现这样的连接

热度:213   发布时间:2016-05-05 08:07:50.0
SQL如何实现这样的连接?
现在有两张表
计划表
业务员 存货 计划金额
张三 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*/
  相关解决方案