我希望SQLplus count(*)返回零值

时间:2012-06-26 06:16:42

标签: sql count

我正在使用Oracle 10.2并具有以下查询:

    select h.company, count(*)  
    from history h 
    where h.status = '2'  
    and h.substatus = '0'  
    and h.timestamp > '2012-01-01'  
    and h.timestamp < '2012-02-01'  
    group by h.company
    having (h.company = 'AAA')  
    or (h.company = 'BBB')  
    or (h.company = 'CCC')  
    order by h.company  

这将计算AAA,BBB或CCC公司的任何客户达到特定点(状态= 2)的次数。
假设BBB没有(零)客户这样做,结果将返回2行计数(AAA和CCC)。

我想要的是:我希望查询能够为所有3家公司返回行,即使计数为零。

很抱歉查询的奇怪布局。它也适用于MS Excel。

编辑:对不起..咖啡因太少了。将查询后半部分的“客户”更改为“公司”。

澄清:通过组合“h.company”和“h.customer”(或在客户表(客户c)中使用相同的方法,如“c.company”和“c.customer”)使客户变得独一无二“

编辑2:更新了代码。

    select c.company, count(*)
    from companyregister c
    left join history h on h.company = c.company
    where h.status = '2'
    and h.substatus = '0'
    and h.timestamp > '2012-01-01'
    and h.timestamp < '2012-02-01'
    group by c.company
    having (c.company = 'AAA')
    or (c.company = 'BBB')
    or (c.company = 'CCC')
    order by c.company

上面的两组代码将产生两行,如下所示: AAA 630 CCC 3020

我想用BBB代表,但由于它们在历史记录中没有行,所以它们没有显示。

1 个答案:

答案 0 :(得分:1)

在客户表上进行左连接。我不知道你的名字是什么,但是像这样:

select c.company, count(h.customer)
from customer as  c
left join history as h on h.customer = c.customer
...

另一种选择是在计数时使用条件。我不确定您是否还需要其他状况,但有些事情就是这样:

select company, sum(case status when '2' then 1 else 0 end)  
from history
where substatus = '0'
and timestamp > '2012-01-01'
and timestamp < '2012-02-01'
and customer in ('AAA', 'BBB', 'CCC')
group by customer  
order by customer