当前位置: 代码迷 >> Sql Server >> 请帮忙,聚合或其他 set 操作消除了 null 值的有关问题
  详细解决方案

请帮忙,聚合或其他 set 操作消除了 null 值的有关问题

热度:62   发布时间:2016-04-24 09:39:51.0
请帮忙,聚合或其他 set 操作消除了 null 值的问题
代码如下
select distinct
a.FDJNO 单据号码,
MAX(convert(varchar(10),a.FDJDate,120)) 单据日期,
MAX(convert(varchar(10),a.FMarkDate,120)) 登记日期,
SUM(b.AMT1) 增票金额,
b.InvNo 发票号,
MAX(H.OPNAME) 业务员,
max(h.fdept) 部门,
MAX(G.FTAMT) 已付金额,
a.SpName 厂商名称
from md_zzsfpctrl a
left join md_zzsfpdtl b on b.fdjno=a.fdjno
LEFT JOIN LIST D ON D.INVNO=a.INVNO
LEFT JOIN (SELECT distinct SUM(isnull(A.FTAMT,0)) FTAMT,
invno=case when B.finvno<>'' then B.finvno else c.Invno end,
case when isnull(b.weituono,'')='' then B.FPayeeNo else b.weituono end 
FPayeeNo,MAX(B.fpayeename) FPAYEENAME FROM PayMgrCtrl B LEFT JOIN PayFT A
ON A.CtrlID=B.FID 
left join (select distinct scno,invno from list1) c on c.scno=B.sono and c.invno=b.finvno  where b.placed='T' 
GROUP BY b.finvno,c.invno,
case when isnull(b.finvno,'')<>'' then b.finvno else c.Invno end,
case when isnull(b.weituono,'')='' then B.FPayeeNo else b.weituono end 
) G ON G.INVNO=A.INVNO and g.fpayeenO=a.SPID
left join SOCTRL c on D.SCNO=c.SONO
LEFT JOIN OP H ON C.RP=H.OPID
WHERE  a.placed='T' and b.invno<>'13SE-542' and b.invno<>'13SE-543' and b.invno<>'13SE-549' and b.invno<>'14SE-107-1'
GROUP BY b.InvNo,a.SpName,A.FDJNO
HAVING MAX(G.FTAMT)<SUM(b.amt1) and not exists (select null from  paystockdtl  where a.fdjno=sourceno )


代码不是我写的,费了半天,解决了重复计算的问题,现在出现,聚合或其他 set 操作消除了 null 值的问题。空值都被消除了。
请大神帮忙写一下,都应该在什么位置加isnull处理。我第一次遇到这个问题,33分全给你了!!!

------解决思路----------------------
这样加,在最外层转换,数字时转为0,字符时转为空字符''
MAX(G.FTAMT) --isnull(MAX(G.FTAMT) ,'')
SUM(b.AMT1)--isnull(SUM(b.AMT1),0)

------解决思路----------------------
警告: 聚合或其他 SET 操作消除了 Null 值。
这个没什么影响,主要看你想要的结果,要是想不出现这个提示,就在聚合之前用isnull处理要聚合的列了。
如下面就不会出现提示了。isnull(max(id),0)会出现提示

declare @tab table(id int)
insert into @tab values (null),(1)
select  max(isnull(id,0)) from @tab

  相关解决方案