GROUP BY中的COUNT Null在同一结果中(SQL Server)

时间:2015-01-12 20:38:07

标签: sql sql-server

我对如何在查询中计算Null值感到有些困惑。

我有一个基本表格,其中包含每个类别的电话号码。我目前只计算收到关于这样一个类别的电话的次数:

SELECT COUNT (Calls) AS Calls, Category
FROM dbo.Calls
GROUP BY Category

这很好用,并给我一个输出,显示每个类别的总呼叫数。但是,有些类别没有电话。这些不会显示,因为COUNT不会计算Null值。

考虑到这一点,我怎样才能获得一个单独的输出,它既计算每个类别的所有调用,又在每个没有任何调用的类别旁边显示0?

互联网上的一些例子表明,当涉及两个表并进行OUTER JOIN时,这是可能的。但如果我只有一张桌子 - 我能在这做什么?

2 个答案:

答案 0 :(得分:2)

计算未在dbo.Calls

中表示的类别

要完成此操作,您需要一个必须始终显示在结果中的类别列表...然后您需要在这些类别和通话之间执行left join

你有分类表吗?如果是这样的话:

select
 cat.Category
,count(c.Category)
from dbo.Categories as cat
    left join dbo.Calls as c
    on c.Category = cat.Category
group by cat.Category

这是SQL Fiddle

如果没有,您可以明确列出类别值(假设它们是字符串):

select
 cat.Category 
,count(c.Category) as Calls
from (values
   ('Bat-Phone')      
  ,('Domestic')
  ,('International')
) cat(Category)
  left join dbo.Calls as c
  on c.Category = cat.Category 
group by cat.Category

这是另一个SQL Fiddle

计算未分类的电话

如果您只想查看未分类的调用,请使用coalesce()isnull()为空值提供虚拟类别,如下所示:

select
 isnull(c.Category, 'Uncategorized') as Category
,count(*)
from Calls as c
group by isnull(c.Category, 'Uncategorized')

和另一个SQL Fiddle

答案 1 :(得分:1)

不会这样做,还是我错过了什么?

SELECT SUM(CASE WHEN Calls IS NOT NULL THEN 1 ELSE 0 END) AS Calls, Category
FROM dbo.Calls
GROUP BY Category