2012-05-18 5 views
1

매우 복잡한 쿼리를 수행하고 있으며 마지막 단계에서 미끄러지고 있습니다.각 그룹에 대해 필드의 출현을 계산 하시겠습니까?

나는 여기까지 얻는 것을 처리했다 :

id refid   system_id item_description_id system_component_id current_status 
711 4fb62cece5313 49   NULL     711     RUNNING 
712 4fb62cece547d 49   NULL     712     STOPPED 
713 4fb62cece5616 50   NULL     713     RUNNING 
714 4fb62cece5803 50   NULL     714     STOPPED 
716 4fb62cece5ab8 51   NULL     716     RUNNING 

이 각 시스템의 모든 구성 요소의 현재 상태입니다. 다음은 시스템별로 그룹화하고 '중지됨'항목을 계산하는 것입니다.

제 문제는 일부 시스템에서는 'STOPPED'가있는 행이나 시스템이 전혀 업데이트되지 않은 행이 전혀 없다는 것입니다. 그러나, 나는 여전히 그들을 결과의 일부로 가져와야합니다. 이 두 가지 경우를 제외하고 시스템별로 그룹화하면 정지 된 구성 요소가 전혀없는 경우에도 결과 값이 '1'입니다.

system_id status_count 
49   1 
50   1 
51   0 

그리고하지 : 위의 표와

system_id status_count 
49   1 
50   1 
51   1 

어떻게 이런 식으로 뭔가를 반환하는 쿼리를 만들 수 있습니까?

+0

답변을 얻었지만 작동하는 경우에도 내 querry를 시도 할 수 있습니다. –

답변

3

는이 같은 SUM(boolean)을 사용해야합니다 :

| SYSTEM_ID | STOPPED_COUNT | RUNNING_COUNT | 
|-----------|---------------|---------------| 
|  49 |    1 |    1 | 
|  50 |    1 |    1 | 
|  51 |    0 |    1 | 

라이브 테스트 : http://www.sqlfiddle.com/#!2/d3bcc/2

하면

select system_id, 
    sum(current_status = 'STOPPED') AS stopped_count, 
    sum(current_status = 'RUNNING') as running_count 
from tbl 
group by system_id 

부울 자동

출력의 MySQL의 정수로 감소 COUNT (또는 해당 문제에 대한 집계 함수) 왼쪽에서 오는 당신이 유착 또는 ISNULL과 결과를 동봉해야 가입 :

select system_id, 
    isnull(sum(current_status = 'STOPPED') , 0) AS stopped_count, 
    isnull(sum(current_status = 'RUNNING') , 0) as running_count 
from tbl 
group by system_id 

ANSI SQL 호환 :

select system_id, 
    coalesce(sum(current_status = 'STOPPED') , 0) AS stopped_count, 
    coalesce(sum(current_status = 'RUNNING') , 0) as running_count 
from tbl 
group by system_id 

일부 데이터베이스가 비록 작은 자세한입니다. PostgreSQL을 : http://www.sqlfiddle.com/#!1/d3bcc/2

select system_id, 
    sum((current_status = 'STOPPED')::int) AS stopped_count, 
    sum((current_status = 'RUNNING')::int) as running_count 
from tbl 
group by system_id 

다른 데이터베이스 : http://www.sqlfiddle.com/#!3/d3bcc/2

select system_id, 
    count(case when current_status = 'STOPPED' then 1 end) AS stopped_count, 
    count(case when current_status = 'RUNNING' then 1 end) as running_count 
from tbl 
group by system_id 
+0

고마워요, 거의 저에게 좋습니다. 그래도 작은 세부 사항이 하나 있습니다. 테이블에 나열되지 않은 일부 시스템이 있지만 최종 결과 (LEFT OUTER JOIN)에 여전히 나열되어 있어야하지만,이 메소드를 사용하면 결과가 NULL이 아니라 0이됩니다. 왜 그런지 알아? 그래도 적어도 지금은 해결할 수 있습니다. 매우 유용한 트릭! – elite5472

+0

LEFT JOIN으로 인해 실제로 발생합니다. 최종 결과는 COALESCE 또는 ISNULL로 묶어야합니다. 나는 답을 보여 주겠다 나는 그것을 편집 할 것이다 –

+0

업데이트 된 답변 확인 –

1
select system_id, 
IF(if(currentstaus = 'RUNNING',0.5,0) + if(currentstaus = 'STOPPED',0.5,0)=1,1,0) 
AS status_count from table_name group by system_id 

이 쿼리를 시도하고 작동 아닌지 말해.

+0

이것은 가능한 상태가 '실행 중'이고 '중지됨'인 경우를 가정합니다. :) – elite5472

+0

@ elite5472 다른 사건의 가능성을 알지 못해서 당신이 필요에 따라 수정할 수있는이 방법으로 만들었습니다 –

+0

서버는 256^32 개의 가능한 상태를 내 데이터베이스에 제출할 수 있습니다. : P – elite5472

관련 문제