我对如何在查询中计算Null值感到有些困惑。
我有一个基本表格,其中包含每个类别的电话号码。我目前只计算收到关于这样一个类别的电话的次数:
SELECT COUNT (Calls) AS Calls, Category
FROM dbo.Calls
GROUP BY Category
这很好用,并给我一个输出,显示每个类别的总呼叫数。但是,有些类别没有电话。这些不会显示,因为COUNT不会计算Null值。
考虑到这一点,我怎样才能获得一个单独的输出,它既计算每个类别的所有调用,又在每个没有任何调用的类别旁边显示0?
互联网上的一些例子表明,当涉及两个表并进行OUTER JOIN时,这是可能的。但如果我只有一张桌子 - 我能在这做什么?
答案 0 :(得分:2)
要完成此操作,您需要一个必须始终显示在结果中的类别列表...然后您需要在这些类别和通话之间执行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
如果没有,您可以明确列出类别值(假设它们是字符串):
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