2014-07-14 2 views
1

그래서 나는 테이블의 데이터에는 다음과 같은 열이 있습니다여러 case 문 합

rating | count 

샘플 :

RED | 0 
ORANGE | 1 
YELLOW | 4 
GREEN | 38 

workordernum | targstart | targfinish | schedstart | schedfinish | actstart | actfinish 

나는 다음과 같은 결과 집합을 반환 할 필요를

등급은 다음 기준을 토대로합니다 :

acfinish <= targfinish (test 0) 
actstart <= schedstart (test 1) 
actfinish <= schedfinish (test 2) 
targstart <= (a calculated column called "halflife") (test 3) 

테스트 0이 실패하면 작업 지시는 자동으로 "빨간색"으로 평가됩니다. 테스트 1, 2 및 3의 경우 3을 모두 통과하면 "녹색", 2를 통과하는 경우 "노란색", 1을 통과하는 경우 "오렌지", 그렇지 않으면 "빨간색"으로 평가됩니다 (또는 그들이 실패하면 0)

SQL 쿼리에서 이것을 처리하는 가장 좋은 방법은 무엇입니까? 내 현재 쿼리는 CASE 문을 사용하여 각 테스트를 1 또는 0으로 평가하지만 그 중 하나를 합산하여 테스트 0을 처리하는 IF 문을 수행해야합니다. 내 생각에 내가 너무 복잡한 것입니다. 또는 도움이 될 수있는 작은 SQL 함수에 대한 지식이 부족합니다.

모든 도움을 주시면 감사하겠습니다. 미리 감사드립니다.


편집 1 : 현재 코드 (요청에 따라)

SELECT 
    wo.wonum, 
    wo.targstartdate, 
    wo.targcompdate, 
    wo.schedstart, 
    wo.schedfinish, 
    wo.actstart, 
    wo.actfinish, 
    FLOOR(
     DATEDIFF(
      DAY, 
      targstartdate, 
      CASE pm.frequnit 
       WHEN 'YEARS' THEN DATEADD(YEAR,pm.frequency,wo.targstartdate) 
       WHEN 'MONTHS' THEN DATEADD(MONTH,pm.frequency,wo.targstartdate) 
       WHEN 'WEEKS' THEN DATEADD(WEEK,pm.frequency,wo.targstartdate) 
       WHEN 'DAYS' THEN DATEADD(DAY,pm.frequency,wo.targstartdate) 
       ELSE targstartdate 
      END 
     ) 
    ) AS halflife, 
    CASE 
     WHEN wo.actfinish < wo.targcompdate THEN 1 
     ELSE 0 
    END AS test0, 
    CASE 
     WHEN wo.actstart <= wo.schedstart THEN 1 
     ELSE 0 
    END AS test1, 
    CASE 
     WHEN wo.actfinish <= wo.schedfinish THEN 1 
     ELSE 0 
    END AS test2, 
    CASE 
     WHEN wo.schedstart <= DATEADD(DAY,FLOOR(DATEDIFF(DAY,wo.targstartdate,CASE pm.frequnit WHEN 'YEARS' THEN DATEADD(YEAR,pm.frequency,wo.targstartdate) WHEN 'MONTHS' THEN DATEADD(MONTH,pm.frequency,wo.targstartdate) WHEN 'WEEKS' THEN DATEADD(WEEK,pm.frequency,wo.targstartdate) WHEN 'DAYS' THEN DATEADD(DAY,pm.frequency,wo.targstartdate) ELSE wo.targstartdate END)),wo.targstartdate) THEN 1 
     ELSE 0 
    END AS test3 
FROM 
    workorder AS wo 
    LEFT OUTER JOIN pm ON pm.pmnum=ISNULL(wo.pmnum,(SELECT pmnum FROM workorder WHERE wonum=wo.parent)) 
WHERE 
    wo.status IN (SELECT value FROM synonymdomain WHERE domainid='WOSTATUS' AND maxvalue IN ('COMP','CLOSE','HISTEDIT')) 
    AND wo.istask=0 
    AND DATEDIFF(MONTH,wo.actfinish,GETDATE())=1 
    AND wo.worktype='PM' 


편집 2 :

그래서 나는 것을 곱하면 다음과 같은 생각 테스트 0을 반환 1 또는 0을 사용하여 내 코드를 업데이트 테스트 1, 2 및 3의 합계에 의해, 그 방법이 실패하면 항상 0을 리턴합니다. 그런 다음 CASE 문을 사용하여 적절한 색으로 레이블을 지정합니다. 그러나 지금은 작업 순서 번호와 등급 목록을 얻고 있습니다. 등급 목록과 해당 항목 수에 맞게 조정해야합니다.

SELECT 
    wo.wonum, 
    CASE 
     (CASE 
      WHEN wo.actfinish < wo.targcompdate THEN 1 
      ELSE 0 
     END * 
     (CASE 
      WHEN wo.actstart <= wo.schedstart THEN 1 
      ELSE 0 
     END + 
     CASE 
      WHEN wo.actfinish <= wo.schedfinish THEN 1 
      ELSE 0 
     END + 
     CASE 
      WHEN wo.schedstart <= DATEADD(DAY,FLOOR(DATEDIFF(DAY,wo.targstartdate,CASE pm.frequnit WHEN 'YEARS' THEN DATEADD(YEAR,pm.frequency,wo.targstartdate) WHEN 'MONTHS' THEN DATEADD(MONTH,pm.frequency,wo.targstartdate) WHEN 'WEEKS' THEN DATEADD(WEEK,pm.frequency,wo.targstartdate) WHEN 'DAYS' THEN DATEADD(DAY,pm.frequency,wo.targstartdate) ELSE wo.targstartdate END)),wo.targstartdate) THEN 1 
      ELSE 0 
     END)) 
     WHEN 3 THEN 'GREEN' 
     WHEN 2 THEN 'YELLOW' 
     WHEN 1 THEN 'ORANGE' 
     WHEN 0 THEN 'RED' 
     ELSE 'RED' 
    END 
FROM 
    workorder AS wo 
    LEFT OUTER JOIN pm ON pm.pmnum=ISNULL(wo.pmnum,(SELECT pmnum FROM workorder WHERE wonum=wo.parent)) 
WHERE 
    wo.status IN (SELECT value FROM synonymdomain WHERE domainid='WOSTATUS' AND maxvalue IN ('COMP','CLOSE','HISTEDIT')) 
    AND wo.istask=0 
    AND DATEDIFF(MONTH,wo.actfinish,GETDATE())=1 
    AND wo.worktype='PM' 


최종 편집 : 그냥 완성도, 나는 뒀다 아래의 최종 코드 :

SELECT rating,count(*) 
FROM 
(SELECT 
    CASE 
     (CASE 
      WHEN wo.actfinish < wo.targcompdate THEN 1 
      ELSE 0 
     END * 
     (CASE 
      WHEN wo.actstart <= wo.schedstart THEN 1 
      ELSE 0 
     END + 
     CASE 
      WHEN wo.actfinish <= wo.schedfinish THEN 1 
      ELSE 0 
     END + 
     CASE 
      WHEN wo.schedstart <= DATEADD(DAY,FLOOR(DATEDIFF(DAY,wo.targstartdate,CASE pm.frequnit WHEN 'YEARS' THEN DATEADD(YEAR,pm.frequency,wo.targstartdate) WHEN 'MONTHS' THEN DATEADD(MONTH,pm.frequency,wo.targstartdate) WHEN 'WEEKS' THEN DATEADD(WEEK,pm.frequency,wo.targstartdate) WHEN 'DAYS' THEN DATEADD(DAY,pm.frequency,wo.targstartdate) ELSE wo.targstartdate END)),wo.targstartdate) THEN 1 
      ELSE 0 
     END)) 
     WHEN 3 THEN 'GREEN' 
     WHEN 2 THEN 'YELLOW' 
     WHEN 1 THEN 'ORANGE' 
     WHEN 0 THEN 'RED' 
     ELSE 'RED' 
    END AS rating 
FROM 
    workorder AS wo 
    LEFT OUTER JOIN pm ON pm.pmnum=ISNULL(wo.pmnum,(SELECT pmnum FROM workorder WHERE wonum=wo.parent)) 
WHERE 
    wo.status IN (SELECT value FROM synonymdomain WHERE domainid='WOSTATUS' AND maxvalue IN ('COMP','CLOSE','HISTEDIT')) 
    AND wo.istask=0 
    AND DATEDIFF(MONTH,wo.actfinish,GETDATE())=1 
    AND wo.worktype='PM' 
) AS worating 
GROUP BY rating 
+0

질문에 'CASE' 문을 사용하여 현재 검색어를 추가 할 수 있습니까? 나는 제시된 규칙들을 읽는 것보다 따르거나 적응하는 것이 더 쉬울 것이라고 생각한다. –

+0

예! 게시물을 편집 할 때 잠깐 줘 –

+0

SQL 코드가 추가되었습니다. –

답변

3

는 같은과 같은 당신의 쿼리에서 수행 된 시험의 합계를 확인하실 수 있습니다 수행원?

SELECT 
    wonum, 
    targstartdate, 
    targcompdate, 
    schedstart, 
    schedfinish, 
    actstart, 
    actfinish, 
    halflife, 
    CASE 
     WHEN test0 + test1 + test2 + test3 >= 3 THEN 'RED' 
     WHEN test0 + test1 + test2 + test3 = 2 THEN 'ORANGE' 
     WHEN test0 + test1 + test2 + test3 = 1 THEN 'YELLOW' 
     WHEN test0 + test1 + test2 + test3 = 0 THEN 'GREEN' 
    END AS Flag 
FROM 
    (
    SELECT .... yourquery 
) s 

편집 1 : 당신이 (? 오른쪽 test0)의 주요 사건을 평가해야 4로, 1이 아닌, 즉,

CASE 
    WHEN wo.actfinish < wo.targcompdate THEN 4 
    ELSE 0 
END AS test0, 

그런 식으로, 아무것도, 쿼리에 그를 추가하는 것을 잊었다 Test Zero가 자동으로 적색 합계까지 합산하지 못합니다.

EDIT 2 : CASE 문을 GROUP BY에 추가하십시오. 명령.과 계수 만 보려면이 조회가 사용자가 찾고있는 것을 수행해야합니다.

SELECT 
    CASE 
     WHEN test0 + test1 + test2 + test3 >= 3 THEN 'RED' 
     WHEN test0 + test1 + test2 + test3 = 2 THEN 'ORANGE' 
     WHEN test0 + test1 + test2 + test3 = 1 THEN 'YELLOW' 
     WHEN test0 + test1 + test2 + test3 = 0 THEN 'GREEN' 
    END AS Rating, 
    COUNT(wonum) AS TotalRecords 
FROM 
    (
    SELECT .... yourquery 
) s 

GROUP BY 
    CASE 
     WHEN test0 + test1 + test2 + test3 >= 3 THEN 'RED' 
     WHEN test0 + test1 + test2 + test3 = 2 THEN 'ORANGE' 
     WHEN test0 + test1 + test2 + test3 = 1 THEN 'YELLOW' 
     WHEN test0 + test1 + test2 + test3 = 0 THEN 'GREEN' 
    END 
+0

해당 코드는 방금 업데이트 한 것과 유사합니다 (답변을 기다리는 동안이 작업을하고 있습니다). 작업 주문에 올바른 등급을 부여하지만 각 유형의 수를 계산하지 않습니다. –

+0

플래그 CASE 문을 GROUP BY 절에 추가 한 다음 쿼리에 COUNT (원)을 추가합니다. 예 : – AHiggins

+0

위의 예 - 나는 여분의 열을 제거하고'CASE' 문과'COUNT()'만을 남긴 다음'CASE' 문을 GROUP BY 절로 복사했습니다. – AHiggins

1

나는 귀하의 케이스를 subselect로 옮겼습니다. 그런 다음 주요 선택 항목에서 색상을 반환하는 사례를 수행했습니다.

SELECT 
    wo.wonum, 
    wo.targstartdate, 
    wo.targcompdate, 
    wo.schedstart, 
    wo.schedfinish, 
    wo.actstart, 
    wo.actfinish, 
    FLOOR(
     DATEDIFF(
      DAY, 
      targstartdate, 
      CASE pm.frequnit 
       WHEN 'YEARS' THEN DATEADD(YEAR,pm.frequency,wo.targstartdate) 
       WHEN 'MONTHS' THEN DATEADD(MONTH,pm.frequency,wo.targstartdate) 
       WHEN 'WEEKS' THEN DATEADD(WEEK,pm.frequency,wo.targstartdate) 
       WHEN 'DAYS' THEN DATEADD(DAY,pm.frequency,wo.targstartdate) 
       ELSE targstartdate 
      END 
     ) 
    ) AS halflife, 
    CASE WHEN wo.test0 = 0 or (wo.test1 + wo.test2+ wo.test3) = 0 then 'RED' 
     WHEN wo.test1 + wo.test2 + wo.test3 = 3 then 'GREEN' 
     WHEN wo.test1 + wo.test2 + wo.test3 = 2 then 'YELLOW' 
     WHEN wo.test1 + wo.test2 + wo.test3 = 1 then 'ORANGE' 
     ELSE '' 
    END AS Rating 
FROM 
    (select * , CASE WHEN wo.actfinish < wo.targcompdate THEN 1 ELSE 0 END AS test0, 
    CASE WHEN wo.actstart <= wo.schedstart THEN 1 ELSE 0 END AS test1, 
    CASE WHEN wo.actfinish <= wo.schedfinish THEN 1 ELSE 0 END AS test2, 
    CASE 
     WHEN wo.schedstart <= DATEADD(DAY,FLOOR(DATEDIFF(DAY,wo.targstartdate,CASE pm.frequnit WHEN 'YEARS' THEN DATEADD(YEAR,pm.frequency,wo.targstartdate) WHEN 'MONTHS' THEN DATEADD(MONTH,pm.frequency,wo.targstartdate) WHEN 'WEEKS' THEN DATEADD(WEEK,pm.frequency,wo.targstartdate) WHEN 'DAYS' THEN DATEADD(DAY,pm.frequency,wo.targstartdate) ELSE wo.targstartdate END)),wo.targstartdate) THEN 1 
     ELSE 0 
    END AS test3 from workorder) AS wo 
    LEFT OUTER JOIN pm ON pm.pmnum=ISNULL(wo.pmnum,(SELECT pmnum FROM workorder WHERE wonum=wo.parent)) 
WHERE 
    wo.status IN (SELECT value FROM synonymdomain WHERE domainid='WOSTATUS' AND maxvalue IN ('COMP','CLOSE','HISTEDIT')) 
    AND wo.istask=0 
    AND DATEDIFF(MONTH,wo.actfinish,GETDATE())=1 
    AND wo.worktype='PM' 
+0

그 코드를 실행하려고했는데 오류가 발생했습니다. (FROM 코드와 관련이 있다고 생각합니다. (쉼표 또는 SELECT * 근처에 있어야합니까?) –

+0

@ D.R 예 예 : – SQLChao