我正在使用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代表,但由于它们在历史记录中没有行,所以它们没有显示。
答案 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