以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]表join时on里边字段部份为null的情况  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=179511)

--  作者:hzcaqjf
--  发布时间:2022/8/27 11:43:00
--  [求助]表join时on里边字段部份为null的情况
现有入库表 出库表, 想根据两表用SQL语句生成盘存表(仓库 名称 品牌 型号 上月结存   本月收进  本月发出  本月结存)
s elect c.仓库,c.名称,c.品牌,c.型号,c.上月结存,d.本月收进 from (s elect a.仓库,a.名称,a.品牌,a.型号,iif(b.月前出库 is null,a.月前入库,(a.月前入库 - b.月前出库)) as 上月结存 from (s elect 仓库,名称,品牌,型号,sum(金额) as 月前入库 from {入库表} where 日期 < #8/1/2022# group by 仓库,名称,品牌,型号) a  left join (s elect 仓库,名称,品牌,型号,sum(金额) as 月前出库 from {出库表} where 日期 < #8/1/2022# group by 仓库,名称,品牌,型号) b on a.仓库 = b.仓库 And a.名称 = b.名称 And a.品牌 = b.品牌 And a.型号 = b.型号) c left join (s elect 仓库,名称,品牌,型号,sum(金额) As 本月收进 from {入库表} where 日期 >= #8/1/2022# and 日期 <= #8/31/2022# group by 仓库,名称,品牌,型号) d on c.仓库 = d.仓库 And c.名称 = d.名称 And c.品牌 = d.品牌 And c.型号 = d.型号
这里无论入库表和出库表,仓库和名称两字段都不为空.
当字段"品牌"或 "型号"中部分为空时,"上月结存"能得到正确结果,"本月收进"则无结果.
当字段"品牌"或 "型号"都不为空时,"上月结存"和"本月收进"都能得到正确结果.
请问某名称商品的品牌或型号允许为空时,如何用SQL语句正确生成盘存表?

--  作者:有点蓝
--  发布时间:2022/8/27 11:56:00
--  
请举例具体表格数据说明。入库表和出库表,"品牌"或 "型号"中部分为空时正确结果应该是怎么样的?
几种情况
1、入库表"品牌"空,"型号"出库"品牌"空"型号"
2、入库表"品牌"不"型号"出库"品牌"空"型号"
3、入库表"品牌""型号"出库"品牌"空"型号"
4、入库表"品牌""型号"出库"品牌""型号"
5、入库表"品牌""型号"出库"品牌"空"型号"
……

--  作者:hzcaqjf
--  发布时间:2022/8/27 16:24:00
--  
文字讲不清楚,现上传实例:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目t.foxdb

名称pd04 本月收进应为100,但这里为空.
如果pd04的品牌 型号不为空,本月收进能显示正确结果(100).
[此贴子已经被作者于2022/8/27 16:30:51编辑过]

--  作者:有点蓝
--  发布时间:2022/8/27 16:37:00
--  
如果都是品牌型号同时为空的情况,则为空的数据单独计算

s elect c.仓库,c.名称,c.品牌,c.型号,c.上月结存,d.本月收进 from (s elect a.仓库,a.名称,a.品牌,a.型号,iif(b.月前出库 is null,a.月前入库,(a.月前入库 - b.月前出库)) as 上月结存 from (s elect 仓库,名称,品牌,型号,sum(金额) as 月前入库 from {入库表} where 日期 < #8/1/2022# group by 仓库,名称,品牌,型号) a  left join (s elect 仓库,名称,品牌,型号,sum(金额) as 月前出库 from {出库表} where 日期 < #8/1/2022# group by 仓库,名称,品牌,型号) b on a.仓库 = b.仓库 And a.名称 = b.名称 And a.品牌 = b.品牌 And a.型号 = b.型号) c left join (s elect 仓库,名称,品牌,型号,sum(金额) As 本月收进 from {入库表} where 日期 >= #8/1/2022# and 日期 <= #8/31/2022# group by 仓库,名称,品牌,型号) d on c.仓库 = d.仓库 And c.名称 = d.名称 And c.品牌 = d.品牌 And c.型号 = d.型号
union
s elect c.仓库,c.名称,c.品牌,c.型号,c.上月结存,d.本月收进 from (s elect a.仓库,a.名称,a.品牌,a.型号,iif(b.月前出库 is null,a.月前入库,(a.月前入库 - b.月前出库)) as 上月结存 from (s elect 仓库,名称,品牌,型号,sum(金额) as 月前入库 from {入库表} where 日期 < #8/1/2022# group by 仓库,名称,品牌,型号) a  left join (s elect 仓库,名称,品牌,型号,sum(金额) as 月前出库 from {出库表} where 日期 < #8/1/2022# group by 仓库,名称,品牌,型号) b on a.仓库 = b.仓库 And a.名称 = b.名称 And a.品牌 is null And a.型号 is null) c left join (s elect 仓库,名称,品牌,型号,sum(金额) As 本月收进 from {入库表} where 日期 >= #8/1/2022# and 日期 <= #8/31/2022# group by 仓库,名称,品牌,型号) d on c.仓库 = d.仓库 And c.名称 = d.名称