Null / 0答案未出现

时间:2014-05-15 17:31:45

标签: sql sql-server

今天的另一个问题:)

写了一个完美的查询 - 除了我希望它将NULL / 0值显示为0 - 并且 - 它不会发生。我试着接近这两种方式:

首先我使用isnull()

Select isnull(Count(*),0) as Total ,
       z.zname
From STable   s   ,
     SLTable  sl  ,
     ZTable   z   ,
     SETable  se  , 
     SEETable see ,
     SEGTable seg
Where s.sID     = sl.sID
  and sl.zID    = z.zID
  and s.sID     = se.sID
  and se.etID   = see.etID
  and see.segID = seg.segID
  and see.segID = 3
Group By z.zname
order by z.zname

似乎没有给我Null / 0值

然后我尝试使用sum / case方法

Select sum(case when see.segID <> 3 then 0 else 1 end) as Total ,
       z.zname
From STable    s   ,
     SLTable   sl  ,
      Table    z   ,
      SETable  se  ,
      SEETable see ,
      SEGTable seg
Where s.sID     = sl.sID
  and sl.zID    = z.zID
  and s.sID     = se.sID
  and se.etID   = see.etID
  and see.segID = seg.segID
  and see.segID = 3
Group By z.zname
order by z.zname

仍然没有0值 - 所以现在我很难过:(

4 个答案:

答案 0 :(得分:0)

实际上只是为了半回答我自己的问题 - 只是意识到哪里 - see.segID-3 - 所以它只会产生segID = 3的结果 - 所以它不能没有3 - 对吗?

但我特意将segIDs视为3 - 只是,如果没有任何内容则显示0

答案 1 :(得分:0)

这是我假设您需要更改的内容

Select 
Count(*) as Total,
z.zname
From STable s, SLTable sl, ZTable z, SETable se, SEETable see, SEGTable seg
Where s.sID=sl.sID
and sl.zID=z.zID
and s.sID=se.sID
and se.etID=see.etID
and see.segID=seg.segID
and see.segID=3
AND TABLE.YOURCOLUMN IS NOT NULL       -- THESE ARE 
AND TABLE.YOURCOLUMN <> 0              -- NEW
GROUP BY z.zname
ORDER BY z.zname

答案 2 :(得分:0)

在您的查询中 isnull(Count(*),0)为Total,

Count永远不会返回null,它将是0到n之间的数值。

所以你的无聊状态永远不会满足。

你可以简单地将select count()写为total ..而不是isnull(Count(),0),当它在表中找不到任何行时它将返回0。

答案 3 :(得分:0)

嗯,目前还不清楚你究竟想要找到什么。但是,您的问题很大一部分是您使用的是旧式的ISO / ANSI join语法。如果您重构联接以使用现代join语法,那么您将获得一个看起来很多(实际上很多)的查询:

select zName = z.zname  , 
       Total = count(*)
From ZTable   z   
join SLTable  sl  on sl.zID    = z.zID
join STable   s   on s.sID     = sl.sID
join SETable  se  on se.sID    = s.sID
join SEETable see on see.etID  = se.etID
                 and see.segID = 3
join SEGTable seg on seg.segID = see.segID
Group By z.zname
order by z.zname

我怀疑您想要获得的是所有 zNames的列表以及他们对segID = 3的尊重。由于您使用的是内部连接,因此您只能看到匹配的zNames。你能做的就是这样:

select zName = z.zname  , 
       Total = sum(case see.segID when 3 then 1 else 0 end)
from      ZTable   z   
left join SLTable  sl  on sl.zID   = z.zID
left join STable   s   on s.sID    = sl.sID
left join SETable  se  on se.sID   = s.sID
left join SEETable see on see.etID = se.etID
group By z.zname
order by z.zname

上述内容将至少从zTable返回每行行一次,其中null个值列表中找不到匹配项。然后我们对它进行分组并计算segID为3的行。