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

请教如何写这样的语句?高手进
表1     t1
code1     name1     num1
1           布料         8
2           原料         9
3           燃料         3
4           辅料         8
表2     t2     num2表示每个月份的库存量
并且code2和date两个为关键字
code2     name2     num2     date
2           原料         5           2007-08
3           燃料         10         2007-07
5           配料         9           2007-07
1           布料         8           2007-08
3           燃料         6           2007-06
2           原料         14         2007-07
得到结果   当前月份的信息,如果t1中的物料在t2中不存在,则num2为0,如果在t2没有当前月的信息,则取t2中对应物料代码的当前月的上一个月,或则说最大的月
code1     name1     num1     num2
1           布料         8             8
2           原料         9             5
3           燃料         3             10
4           辅料         8             0


------解决方案--------------------

Select a.code1,a.name1,a.num1,isnull(b.num2,0) as num2
from t1 as a ,(
Select code2,num2 from t2 as x
Where not exists(Select * from t2
Where code2=x.code2 and date> x.date)) as b
on a.code1=b.code2
------解决方案--------------------
WangZWang(先来),應該用left join
------解决方案--------------------

步骤一、建视图v1:对t2,按分组code2,获取最大date。

select code2,max(date) as date from t2 group by code2

运行结果:
code2 date
1 2007-08
2 2007-08
3 2007-07
5 2007-07

步骤二、建视图v2:获取每个code2的最大date的num2。

select t2.code2,t2.num2,t2.date from t2 inner join v1 on t2.code2 = v1.code2 and t2.date = v1.date

运行结果:
code2 num2 date
1 8 2007-08
2 5 2007-08
3 10 2007-07
5 9 2007-07

步骤三、建视图v3:最终结果视图。

select t1.code1,t1.name1,t1.num1,isnull(v2.num2,0) as num2 from t1 left outer join v2 on t1.code1 = v2.code2

code1 name1 num1 num2
1 布料 8 8
2 原料 9 5
3 燃料 3 10
4 辅料 8 0

视图v2是绕了一圈得到的结果,是解决问题的关键点。
------解决方案--------------------
drop table #t2
drop table #t1
create table #t1
(code1 int, name1 varchar(10), num1 int)
insert into #t1
select 1, '布料 ', 8 union all
select 2, '原料 ', 9 union all
select 3, '燃料 ', 3 union all
select 4, '輔料 ', 8

create table #t2
(code2 int, name2 varchar(10), num2 int, date varchar(10))