日期:2014-05-18  浏览次数:20606 次

来自三张表的,这个查询怎么写?谁帮我一下,我在做一个复杂的日报表
表1:
日期     名称           生产
2006       笔             1.66
2006       纸             <null>

表2
日期       名称           入库
2005       纸               66
2006       笔               60
2006       笔             <null>
2006       皮             <null>

表3
日期       名称           出库
2005       纸               10
2006       笔               2

按日期和名字合并三张表显示如下
日期       名字         生产           入库           出库
2005         纸           <null>       66                 10    
2006         笔           1.66           60               <null>
2006         笔           <null>     <null>           2
2006         纸           <null>       66               <null>
2006         皮           <null>       <null>       <null>

就是合并三张表,日期和名称相同的,生产,入库,出库有空的才合并,无重复数据出现
还有就是大家有没有比较好的方法制作日报表,就是每日,有哪些产品发生了生产,入库,出库的统计报表。

------解决方案--------------------
select isnull(isnull(a.日期,b.日期),c.日期) 日期, isnull(isnull(a.名称,b.名称),c.名称) 名称, sum(a.生产), sum(b.入库) , sum(c.出库 )
from (select 日期, 名称,sum(生产) 生产 from #表1 group by 日期,名称 )a
FULL outer join
(select 日期, 名称,sum(入库) 入库 from #表2 group by 日期,名称 ) b
on a.日期=b.日期 and a.名称=b.名称
FULL outer join
(select 日期, 名称,sum(出库) 出库 from #表3 group by 日期,名称 ) c
on a.日期=c.日期 and a.名称=c.名称
group by isnull(isnull(a.日期,b.日期),c.日期), isnull(isnull(a.名称,b.名称),c.名称)
------解决方案--------------------

select 名称,日期,max(生产) as 生产,max(入库) as 入库 ,max(出库) as 出库
from(
select isnull(表1.名称,isnull(表2.名称,表3.名称)) as 名称,isnull(表1.日期,isnull(表2.日期,表3.日期)) as 日期,
生产,入库,出库
from 表1 FULL OUTER JOIN 表2 on 表1.日期=表2.日期 and 表1.名称=表2.名称
FULL OUTER JOIN 表3 on 表1.日期=表3.日期 and 表1.名称=表3.名称 and 表2.日期=表3.日期 and 表2.名称=表3.名称
)a
group by 名称,日期
------解决方案--------------------


select 名称,日期,max(生产) as 生产,max(入库) as 入库 ,max(出库) as 出库
from(
select isnull(表1.名称,isnull(表2.名称,表3.名称)) as 名称,isnull(表1.日期,isnull(表2.日期,表3.日期)) as 日期,
生产,入库,出库
from 表1 FULL OUTER JOIN 表2 on 表1.日期=表2.日期 and 表1.名称=表2.名称
FULL OUTER JOIN 表3 on 表1.日期=表3.日期 and 表1.名称=表3.名称 and 表2.日期=表3.日期 and 表2.名称=表3.名称
)a
where isnull(生产, ' ')= ' ' or isnull(入库, ' ')= ' ' or isnull(出库, ' ')= ' '
group by 名称,日期
union
select 名称,日期,生产,入库,出库
from(
select isnull