我这有三张表。一张是商品表。里面有如:
(shangpin)商品表 商品进货单(spjhd) 商品退货单
商品代码(spdm) 名称 商品代码 进货数量 (sl1) 商品代码 退货数量(sl2)
8818c20 花色衬衫 ... 10 8818c20 3
6617d30 白色棉衣 ... 2 ... 1
... ..... ... 6 ... 2我用左联结。让进货单和退货单联结商品表(商品表里面包含所有的商品代码和名) 然后想求出实际进货数(进货一退货)
我的公式如这样。
select a.spdm,sl1 as 进货,sl2 as 退货,(sl1-sl2) as 实际进货 from shangpin as a
left join spjhd as b on a.spdm=b.spdm
left join spthd as c on a.spdm=c.spdm
但是得出来的结果如下: spdm | 进货 | 退货 | 实际进货 |
8819c20 10 null null
8862c30 6 3 3
...... null 10 null如果在商品表里面有的代码。而在进货或者退货里面没有发生过数据。就会返回null 值。因为null值实际进货得出来的数字就不准确。如。进货为null 退货有3件。实际进货数还是null 反之也是一样。
(shangpin)商品表 商品进货单(spjhd) 商品退货单
商品代码(spdm) 名称 商品代码 进货数量 (sl1) 商品代码 退货数量(sl2)
8818c20 花色衬衫 ... 10 8818c20 3
6617d30 白色棉衣 ... 2 ... 1
... ..... ... 6 ... 2我用左联结。让进货单和退货单联结商品表(商品表里面包含所有的商品代码和名) 然后想求出实际进货数(进货一退货)
我的公式如这样。
select a.spdm,sl1 as 进货,sl2 as 退货,(sl1-sl2) as 实际进货 from shangpin as a
left join spjhd as b on a.spdm=b.spdm
left join spthd as c on a.spdm=c.spdm
但是得出来的结果如下: spdm | 进货 | 退货 | 实际进货 |
8819c20 10 null null
8862c30 6 3 3
...... null 10 null如果在商品表里面有的代码。而在进货或者退货里面没有发生过数据。就会返回null 值。因为null值实际进货得出来的数字就不准确。如。进货为null 退货有3件。实际进货数还是null 反之也是一样。
解决方案 »
- 【图】Excel导入Access后某字段多一个空格,用DBgrid显示多一个问号,怎么处理,只有这么多分了,解决立刻送分上门
- 一个退出键,为什么这样写?
- 数据库出错信息一问.急!!谢
- 有关证券交易所数据读取,一分钟刷新几十次覆盖记录表(dbf),影响我读取数据吗?
- 如何固定窗体位置不能移动?
- 征求大家意见
- 关于窗本的生存周期,谁帮我???!!!
- 有没有练习打字的delphi程序
- 在delphi中怎样判断一个字符串是整型的?????
- 不重新编译dll,如何把数据加载到dll中
- 为什么我用了Pascal的文本文件的操作函之后,程序第一次可以启动,第二次启动时会出现错误?
- 请大家帮忙解释一下每句的含义
select a.spdm,sl1 as 进货,sl2 as 退货,
case
when sl2 is null then sl1
when sl2 is not null then sl1-sl2
end as 实际进货 from shangpin as a
left join spjhd as b on a.spdm=b.spdm
left join spthd as c on a.spdm=c.spdm
select a.spdm,sl1 as 进货,sl2 as 退货,(sl1-sl2) as 实际进货 from shangpin as a
inner join spjhd as b on a.spdm=b.spdm
inner join spthd as c on a.spdm=c.spdm
from @shangpin A
Left join @spjhd B on A.spdm=B.spdm
Left join @spthd C on A.spdm=C.spdm/* 结果是:
spdm 进货 退货 实际进货
-------------------------------
8819c20 10 0 10
8862c30 6 3 3
...... 0 10 -10有进货,而没有退货时,退货0表示,实际进货=进货
有进货,有退货时,进货,退货正常表示,实际进货=进货-退货
没有进货,有退货时,进货0表示,实际进货=退货(负数表示)
*/
case when isNull(isNull(B.sl1,0)-isNull(C.sl2,0),0)<0 then 0 else isNull(isNull(B.sl1,0)-isNull(C.sl2,0),0) end 实际进货
from @shangpin A
Left join @spjhd B on A.spdm=B.spdm
Left join @spthd C on A.spdm=C.spdm/* 结果是:
spdm 进货 退货 实际进货
-------------------------------
8819c20 10 0 10
8862c30 6 3 3
...... 0 10 0
*/