0

我正在使用 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,但由于它们在历史记录中的行数为零,因此它们不会显示。

4

1 回答 1

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
于 2012-06-26T06:31:07.323 回答