请教一个问题:YPrk入库表和YPck出库表,我现在想查询出6月份商品的入库、出库、库存情况。
YPrk表记录如下:
名称 规格 编码 入库日期 入库数量
尼龙线 T002红 Nlx 2012-07-08 20
尼龙线 T001白色 002 2012-06-09 20
袜丝线 T001黄色 001 2012-05-07 15Ypck表记录如下:
名称 规格 编码 出货日期 出货数量
尼龙线 T001白色 002 2012-07-07 10
尼龙线 T002红 Nlx 2012-06-13 5我想得到6月份的结果应该是:
名称 规格 编码 累计进货 6月进货 累计出货 6月出货 现库存
尼龙线 T001白色 002 20 20 10 0 10
尼龙线 T002红 Nlx 20 0 5 5 15
请问这样的语句应该怎么实现:我尝试用 Right Join S1:=' (select 名称,规格,编码,sum(进货数量)as DqJh from YpRk where (Year(进货日期)=:Y1)and(Month(进货日期)=:M1) group by 名称,规格,编码) t1 ';
S2:=' (select 名称,规格,编码,sum(出货数量)as DqCh from YpCk where (Year(出货日期)=:CkY1)and(Month(出货日期)=:CkM1) group by 名称,规格,编码) t2 ';
S3:=' (select 名称,规格,编码,sum(进货数量)as LjJh from YpRk group by 名称,规格,编码) t3 ';//累计进货
S4:=' (select 名称,规格,编码,sum(出货数量)as LjCh from Ypck group by 名称,规格,编码) t4 ';//累计出货
S5:=' (select t3.*,t4.LjCh,(t3.LjJh-iif(t4.LjCh is null,0,t4.LjCh))as Ljkc from '+s3+
' left join '+s4+' on ((t3.编码=t4.编码)and(t3.规格=t4.规格))) t5 ';
//s6=s5 Right Join s1--------以进货为主
S6:=' (select t5.*,t1.DqJh from '+s5+' Right Join '+s1+' on ((t5.编码=t1.编码)and(t5.规格=t1.规格))) t6 ';
//---Sqls=S6 Left Join S2
Sqls:='Select t6.*,t2.DqCh From '+S6+' Left Join '+S2+ ' on ((t6.编码=t2.编码)and(t6.规格=t2.规格)) '; with Aq_Find do
begin
close;
SQL.Clear;
SQL.Add(Sqls);
Parameters.ParamByName('Y1').Value:=Year1.Text;
Parameters.ParamByName('m1').Value:= Mon1.Text;
Parameters.ParamByName('CkY1').Value:=Year1.Text;
Parameters.ParamByName('Ckm1').Value:= Mon1.Text;
Open;
end;
可是只能得到一条记录,请问怎么实现
名称 规格 编码 累计进货 6月进货 累计出货 6月出货 现库存
尼龙线 T001白色 002 20 20 10 0 10
YPrk表记录如下:
名称 规格 编码 入库日期 入库数量
尼龙线 T002红 Nlx 2012-07-08 20
尼龙线 T001白色 002 2012-06-09 20
袜丝线 T001黄色 001 2012-05-07 15Ypck表记录如下:
名称 规格 编码 出货日期 出货数量
尼龙线 T001白色 002 2012-07-07 10
尼龙线 T002红 Nlx 2012-06-13 5我想得到6月份的结果应该是:
名称 规格 编码 累计进货 6月进货 累计出货 6月出货 现库存
尼龙线 T001白色 002 20 20 10 0 10
尼龙线 T002红 Nlx 20 0 5 5 15
请问这样的语句应该怎么实现:我尝试用 Right Join S1:=' (select 名称,规格,编码,sum(进货数量)as DqJh from YpRk where (Year(进货日期)=:Y1)and(Month(进货日期)=:M1) group by 名称,规格,编码) t1 ';
S2:=' (select 名称,规格,编码,sum(出货数量)as DqCh from YpCk where (Year(出货日期)=:CkY1)and(Month(出货日期)=:CkM1) group by 名称,规格,编码) t2 ';
S3:=' (select 名称,规格,编码,sum(进货数量)as LjJh from YpRk group by 名称,规格,编码) t3 ';//累计进货
S4:=' (select 名称,规格,编码,sum(出货数量)as LjCh from Ypck group by 名称,规格,编码) t4 ';//累计出货
S5:=' (select t3.*,t4.LjCh,(t3.LjJh-iif(t4.LjCh is null,0,t4.LjCh))as Ljkc from '+s3+
' left join '+s4+' on ((t3.编码=t4.编码)and(t3.规格=t4.规格))) t5 ';
//s6=s5 Right Join s1--------以进货为主
S6:=' (select t5.*,t1.DqJh from '+s5+' Right Join '+s1+' on ((t5.编码=t1.编码)and(t5.规格=t1.规格))) t6 ';
//---Sqls=S6 Left Join S2
Sqls:='Select t6.*,t2.DqCh From '+S6+' Left Join '+S2+ ' on ((t6.编码=t2.编码)and(t6.规格=t2.规格)) '; with Aq_Find do
begin
close;
SQL.Clear;
SQL.Add(Sqls);
Parameters.ParamByName('Y1').Value:=Year1.Text;
Parameters.ParamByName('m1').Value:= Mon1.Text;
Parameters.ParamByName('CkY1').Value:=Year1.Text;
Parameters.ParamByName('Ckm1').Value:= Mon1.Text;
Open;
end;
可是只能得到一条记录,请问怎么实现
名称 规格 编码 累计进货 6月进货 累计出货 6月出货 现库存
尼龙线 T001白色 002 20 20 10 0 10
合t2 left join t4 得 t6
再拿 t5 full join t6 从这里边选数据就OK了..记得处理 空的情况噢... full join 的时候, 最容易出现空了.. 拿t5.X 与 t6.X 判断一下就可以了..
否则就用建一个新表,用代码实现吧,先用left join查询,一笔笔添加到新表中,再用right join查询,然后添加,最后查询新表