2012-10-16 5 views
1

아래 코드 중 몇 가지 진술이 있는데이 방법을 훨씬 간단하고 쉽게 작성하는 방법을 찾으려고합니다. 나는 CASE 문이 최선이라고 생각할 것이다. 그러나 몇 일간의 시행 착오 후에 나는 그렇게하는 법을 알 수 없었다. 모든 도움 및/또는 설명은 크게 감사하겠습니다.여러 선택 대신 case 문

select Count(lcs.statename) as [Name 1] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Follow Up' 
    AND lcnum = '412' 
    AND status = '0' 
select Count(lcs.statename) as [Name 2] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Initial Review' 
    AND lcnum = '412' 
    AND status = '0' 
select Count(lcs.statename) as [Name 3] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Execution' 
    AND lcnum = '412' 
    AND status = '0' 
select Count(lcs.statename) as [Name 4] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Holdback' 
    AND lcnum = '412' 
    AND status = '0' 
+1

*** *** ***은 많은 데이터베이스 시스템에서 사용되는 언어이지만 구조적 쿼리 언어 *는 아닙니다. 데이터베이스 제품이 아닙니다 ... 구문에 대한 자세한 내용은 공급 업체별입니다. 그래서 우리는 무엇을 알아야합니까? ** 데이터베이스 시스템 ** (그리고 어떤 버전)을 사용하고 계신지 ... –

답변

2

시도 뭔가 같은 :

SELECT SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1], 
    SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2], 
    SUM(CASE WHEN lcs.statename = 'Execution' THEN 1 ELSE 0 END) as [Name 3], 
    SUM(CASE WHEN lcs.statename = 'Holdback' THEN 1 ELSE 0 END) as [Name 4] 
FROM hsi.itemlc as ilc 
LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
WHERE lcnum = '412' 
AND status = '0' 
+0

완벽하게 작동합니다 ... 몇 일 동안 배수구가 있지만 감사합니다. – John

+0

이제 다른 열을 추가하면 어떻게됩니까? "메시지 8120, 수준 16, 상태 1, 줄 1 열 'hsi.itemlc.itemnum'이 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 올바르지 않습니다." SELECT – John

+0

@John 바로 뒤에 ilc.itemnum을 [테스트]로 추가하려고 할 때 오류가 발생했습니다. 해당 열을 GROUP BY에 부여해야합니다. –

1

당신은 SUM (함께 할 수있는)과 CASE :

SELECT 
     SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1], 
     SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2], 
     ... 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    WHERE lcnum = '412' AND status = '0'; 

또는 여러 행을 읽을 수 있는지, 당신이 사용할 수 GROUP BY :

SELECT lcs.statename, COUNT(*) AS num 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    WHERE lcnum = '412' AND status = '0' 
    GROUP BY lcs.statename; 

이는 다음과 같이의 SUM() 기능 CASE 문을 사용할 수 있습니다

Follow Up  25 
Initial Review 17 
... 
0

처럼 U 뭔가 :

SELECT SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1], 
     SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2], 
     SUM(CASE WHEN lcs.statename = 'Execution' THEN 1 ELSE 0 END) as [Name 3], 
     SUM(CASE WHEN lcs.statename = 'Holdback' THEN 1 ELSE 0 END) as [Name 4] 
FROM hsi.itemlc as ilc 
LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
WHERE lcnum = '412' 
    AND status = '0' 

각 상태 이름의 조건 카운트 초래한다.