首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

SQL怎么实现这样的连接

2012-02-12 
SQL如何实现这样的连接?现在有两张表计划表业务员存货计划金额张三A1000李四A2000实际表业务员存货实际金

SQL如何实现这样的连接?
现在有两张表
计划表
业务员存货计划金额
张三A1000
李四A2000


实际表
业务员存货实际金额
张三A900
张三B800




要出这样的一张分析报表 怎么实现?
业务员存货实际金额计划金额计划完成率
张三A100090090%
张三B800
李四A2000
合计3000170056.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*/ 

热点排行