그래서 나는 테이블의 데이터에는 다음과 같은 열이 있습니다여러 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
질문에 'CASE' 문을 사용하여 현재 검색어를 추가 할 수 있습니까? 나는 제시된 규칙들을 읽는 것보다 따르거나 적응하는 것이 더 쉬울 것이라고 생각한다. –
예! 게시물을 편집 할 때 잠깐 줘 –
SQL 코드가 추가되었습니다. –