2012-06-26 3 views
0

내가 오라클 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의 고객이 없다고 가정하면 결과가 2 행 (AAA 및 CCC)으로 반환됩니다.

내가 원하는 것 : 3 개의 회사 모두에 대해 쿼리가 나를 돌려 주길 바란다. 심지어 그 수는 0이다.

검색어가 이상하게 생겨서 죄송합니다. MS Excel에서도 작동합니다.

편집 : 죄송 .. 너무 적은 카페인. 쿼리의 후반부에 "고객"을 "회사"로 변경했습니다.

설명 : 고객은 "h.company"및 "h.customer"(또는 고객 테이블 (고객 c)에서 동일한 방법 (예 : c.company 및 c. 고객 "

편집 2 :. 3020

내가 BBB가 표현하고 싶은 AAA (630) CCC를 다음과 같이 업데이트 된 코드 위의 코드

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 

두 세트는 두 행을 얻을 것입니다 하지만 그들은 역사상 제로 행을 가지고 있기 때문에, 그들은 보여주지 않는다.

+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