2012-06-26 2 views
0

Я использую Oracle 10.2 и имеют следующий запрос:Я хочу, чтобы количество Sqlplus (*), чтобы вернуть нулевые значения

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, результат вернется с двумя строками счета (AAA и CCC).

Что я хочу: Я хочу, чтобы запрос возвращал мне строки для всех трех компаний, даже если счет равен нулю.

Извините за нечетное расположение запроса. Он также работает с MS Excel.

Редактировать: Извините .. Слишком маленький кофеин. изменил «Клиент» в более поздней половине запроса на «Компания».

Уточнение: Клиент создан уникально, объединяя «h.company» и «h.customer» (или используя тот же метод в таблице клиентов (клиент c), например «c.company» и «c. клиент»

Edit 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

Я хотел бы иметь ВВВ представлял, но поскольку они имеют нулевые строки в истории, они не показывают.

+0

Сделано несколько ошибок в запросе. Изменил «клиент» на «компанию». Извините, что – Numpus

ответ

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 
+0

'count (*)' будет считать неправильные значения (особенно это вернет '1' для тех клиентов, которые не находятся в истории. Это должно быть' count (h.customer) ' –

+0

@a_horse_with_no_name: Да, вы, конечно, правы. Я забыл, что при написании ответа я исправил его сейчас. :) – Guffa

+0

Я использовал предоставленный вами код, но мне пришлось попробовать некоторые изменения, так как я предоставил запрос с несколько ошибок в моем сообщении. – Numpus

Смежные вопросы