2013-01-09 2 views
0

저는 여기 초보자이며 일부 테스트 결과를 저장할 테이블이 있습니다.이 SQL 쿼리를 개선하려면 어떻게합니까?

열이 2 열을 간략화 할 수

EXECUTION_ID int(6) CASE_ID int(11) 
RESULT varchar(10). 

과 열 "RESULT"은 열거 * "FAIL", '"PASS"의 값을 저장하고, 실제로 NORESULT ' *.

이제 모든 실행에 대한 통계를 얻기 위해 하나의 SQL 쿼리를 사용하고 싶습니다.

같은 결과 집합 형식 :

EXECUTION_ID | PASS_CNT FAIL_CNT | NORESULT_CNT 

나는 단지 같은 그것을 구현하는 하나의 방법을 찾을 수 있습니다

select A.execId,A.a,B.a,C.a from 
    (select execId,result,count(result) a from STAT_RESULTS group by execId,result having result='PASS') A left join 
    (select execId,result,count(result) a from STAT_RESULTS group by execId,result having result='FAIL') B on A.execId=B.execId left join 
    (select execId,result,count(result) a from STAT_RESULTS group by execId,result having result='NORESULT') C on A.execId=C.execId; 

결과 목록을 다음과 같이 :

execId pass fail noresult 
55  169  77  null 
56  46  9  1 
57  120  13  3 
58  91  45  null 
59  95  44  null 
60  179  9  5 

인가 같은 일을하는 더 좋은 방법이 있습니까?

감사합니다.

+0

어떤 데이터베이스 엔진을 사용해야합니까? MySQL, 오라클, ...? 이 기사에서 http://www.artfulsoftware.com/infotree/qrytip.php?id=78 –

+0

@ s.bandara를 확인하십시오 : 관련된 열거 형이 있으므로 거의 단지 MySQL이 될 수 있습니다 –

+0

훌륭함, 그 튜토리얼은 그에게 옳은 일. –

답변

1

어떨까요?

select 
s.execid EXECUTION_ID 
,sum(case when s.result='PASS' then 1 else 0 end) PASS_CNT 
,sum(case when s.result='FAIL' then 1 else 0 end) FAIL_CNT 
,sum(case when s.result='NORESULT' then 1 else 0 end) NORESULT_CNT 
from STAT_RESULTS s 
group by s.execid 
+0

감사합니다, 디코딩은 오라클에서만 작동하는 것처럼 보입니다. 맞습니까? – Frank

+0

맞아. 나는 "경우 ..."로 바꾼다. 좋은가요? – user1960436

+0

+1 가능한 최상의 솔루션입니다. – Bohemian

관련 문제