主表为 t_ICItemCore 
物料ID   物料代码  物料名称  规格型号 
FItemID  FNumber   FName     FModel第2张表 t_ICItemBase
物料ID    安全库存 
FItemID   FSecInv第3张表 ICInventory
物料ID    实际库存 
FItemID   FQty现在我用下面的SQL语句查询
SELECT   t_ICItemCore.FNumber AS 物料代码,
t_ICItemCore.FName AS 物料名称, 
t_ICItemCore.FModel AS 规格型号, 
t_ICItemBase.FSecInv AS 安全库存, 
SUM(ICInventory.FQty) as 实际库存,
SUM(ICInventory.FQty)-convert(float,t_ICItemBase.FSecInv) As 差别
FROM t_ICItemCore 
RIGHT OUTER JOIN t_ICItemBase ON t_ICItemCore.FItemID = t_ICItemBase.FItemID 
LEFT OUTER JOIN ICInventory ON t_ICItemBase.FItemID = ICInventory.FItemID
         where t_ICItemCore.FNumberlike '3%'
group by t_ICItemCore.FItemID,t_ICItemCore.FModel,t_ICItemCore.FName,t_ICItemCore.FNumber,t_ICItemBase.FSecInv
having t_ICItemBase.FSecInv >0 and SUM(ICInventory.FQty) <=t_ICItemBase.FSecInv
order by 物料代码这个语句查询的是通过公用的FItemID查询主表t_ICItemCore 中的所有以 物料代码'3'开头的实际库存低于安全库存的数据(前提条件是安全库存大于0).这条语句查询的结果没有任何问题.
问题在下面:
我所查询的主表t_ICItemCore中很多数据并没有实际库存,也就是说只有一部分数据可以在表t_ICItemBase查询到实际库存
比如某物料代码 3.001.009 数据如下:
物料ID   物料代码    物料名称  规格型号  安全库存  实际库存                 差别
2009     3.001.009   流感      H1N1      100       null空(什么都不显示)     ( 空)
如果按照上面的SQL语句查询,就查不到这条数据,
原因是因为 3.001.009 物料的实际库存为空(什么都没有,在实际库存t_ICItemBase表中找不到物料ID为2009的这条数据
但我想查询 所有物料代码'3'开头的实际库存低于安全库存的数据
(其中没有实际库存的也要查询出来,没有实际库存也应该当成低于安全库存!)
不知道这条SQL语句应该怎么写?

解决方案 »

  1.   

    字段名 is null可将空值显示
      

  2.   

    is null加在什么地方?怎么写?
      

  3.   

    不是为空的问题
    在实际库存t_ICItemBase表中找不到物料ID为2009的这条数据)
    就是说在主表t_ICItemCore中 代码为3.001.009 的这条数据在 ]
    实际库存t_ICItemBase表中根本没有数据
    但我又想把他和低于安全库存的的数据一起查找出来
    没有实际库存也应该当成低于安全库存!
      

  4.   

    很简单啊,就这样:SELECT  t_ICItemCore.FNumber AS 物料代码, 
    t_ICItemCore.FName AS 物料名称, 
    t_ICItemCore.FModel AS 规格型号, 
    t_ICItemBase.FSecInv AS 安全库存, 
    isnull(SUM(ICInventory.FQty),0) as 实际库存, 
    isnull(SUM(ICInventory.FQty),0)-convert(float,t_ICItemBase.FSecInv) As 差别 
    FROM t_ICItemCore 
    RIGHT OUTER JOIN t_ICItemBase ON t_ICItemCore.FItemID = t_ICItemBase.FItemID 
    LEFT OUTER JOIN ICInventory ON t_ICItemBase.FItemID = ICInventory.FItemID 
            where t_ICItemCore.FNumberlike '3%' 
    group by t_ICItemCore.FItemID,t_ICItemCore.FModel,t_ICItemCore.FName,t_ICItemCore.FNumber,t_ICItemBase.FSecInv 
    having t_ICItemBase.FSecInv >0 and isnull(SUM(ICInventory.FQty),0) <=t_ICItemBase.FSecInv 
    order by 物料代码
      

  5.   

    前面改成这样
    ISNULL(SUM(ICInventory.FQty),0) as 实际库存 后面条件改成这样!
    and ISNULL(SUM(ICInventory.FQty),0) <=t_ICItemBase.FSecInv 
      

  6.   


    主表 t_ICItemCore 中代码为3.001.009 的这条数据 在 实际库存 ICInventory.FQty 根本没有数据!
    加 is null 可以查询??
      

  7.   

    用外连接LEFT JOIN OR RIGHT JOIN 
    然后用ISNULL()设置成0;
      

  8.   

    小弟现在在网吧啊,没办法试,小弟对is null用法不熟,is null是判断为空的,但表中如果根本没有这条数据,也可以查??主表 t_ICItemCore 中代码为3.001.009 的这条数据 在 实际库存 ICInventory.FQty 根本没有数据! 
    加 is null 可以查询??
      

  9.   


    用外连接LEFT JOIN OR RIGHT JOIN 
    然后用ISNULL()设置成0;
    怎么设置????????????
      

  10.   

    前面的回答就是!!ISNULL那是函数如果为空就等于0
    isnull(SUM(ICInventory.FQty),0)
      

  11.   

    估计你把isnull和is null混淆了,中间没有空格,那个连起来是一个null转换函数,如果是is null仅仅是用来判断是否为空。