检查所有行的列是否都不为空

时间:2018-09-27 08:36:12

标签: sql sql-server

如果在COLUMN B中按COLUMN A分组的所有行都不为空,则我在获取信息时遇到问题。我在下面提供查询:

select 
    z.zamodb_id, zp.zamodbpoz_id, zp.data_planowana 
from 
    zamodbpoz zp
inner join 
    zamodb z on z.zamodb_id = zp.zamodb_id
inner join 
    sys_dok_stan ds on z.zamodb_id = ds.dok_id
inner join 
    cechwytw cw on cw.wytwor_id = zp.wytwor_id and cw.katparam_id = 52
left join 
    dyspozycje_partii dp on dp.dok_poz_id = zp.zamodbpoz_id
left join 
    (select 
         zp.zamodbpoz_id, isnull(wzp.ilosc, 0) ilosc 
     from  
         zamodb z
     inner join 
         zamodbpoz zp on z.zamodb_id = zp.zamodb_id
     left join 
         alokdok a on a.doknad_poz_id = zp.zamodbpoz_id and a.typdok_nad = 11
     left join 
         dokument_wydania_zewn wz on a.dokpod_id = wz.dokwydzew_id and wz.statusdwz <> 3
     left join 
         dokument_wydania_zewn_poz wzp on wz.dokwydzew_id = wzp.dokwydzew_id
     group by 
         zp.zamodbpoz_id,wzp.ilosc) ile_wz on zp.zamodbpoz_id = ile_wz.zamodbpoz_id
where 
    ds.dok_stan_idn = 'PLANISTA' and z.statzamodb = 1
group by 
    zp.zamodbpoz_id, zp.ilpotw, zp.ilzreal, 
    dp.ilosc, ile_wz.ilosc, z.zamodb_id, zp.data_planowana
having 
    zp.ilpotw - zp.ilzreal - isnull(dp.ilosc, 0) - isnull(ile_wz.ilosc, 0) > 0

只有一个结果:

piece of result

如何检查z.zamodb = 446341是否在所有行的第三列中都有值?如您在图片上看到的,NULL有一行,我想跳过所有z.zamodb_id = 446341的记录。

2 个答案:

答案 0 :(得分:1)

我不知道您当前的HAVING子句在做什么,或者它是否还在工作,但这是您可以使用的逻辑:

HAVING COUNT(*) = COUNT(zp.data_planowana)

由于COUNT不包含NULL值,并且COUNT(*)始终返回该组中的记录总数,因此只有{{1}列没有zp.data_planowana值。

答案 1 :(得分:1)

使用窗口聚合将Tim的逻辑应用于具有相同zamodb_id的所有行:

with cte as 
 ( select z.zamodb_id,zp.zamodbpoz_id,zp.data_planowana
      ,count(*)                 over (partition by z.zamodb_id) as cntStar
      ,count(zp.data_planowana) over (partition by z.zamodb_id) as cntCol
   from zamodbpoz zp
   ....
 )
select *
from cte
where cntStar = cntCol