Development Tip

필드의 조건부 개수

yourdevel 2020. 12. 13. 11:17
반응형

필드의 조건부 개수


다음과 같은 테이블이 있다면 :

jobId, jobName, Priority

우선 순위는 1에서 5 사이의 정수일 수 있습니다.

보고서에서 차트를 생성하려면이 쿼리가 필요하므로 작업 ID, 작업 이름 및 Priority1, Priority2, Priority3, Priority4라는 5 개의 필드를 표시해야합니다. 우선 순위 5.

Priority1은 우선 순위 필드의 값이 1 인 행 수를 계산해야합니다.

Priority2는 우선 순위 필드의 값이 2 인 행 수를 계산해야합니다.

Priority3은 우선 순위 필드의 값이 3 인 행 수를 계산해야합니다.

기타

어떻게하면 빠르고 효율적으로 할 수 있습니까?

많은 감사합니다, Kave


나는 당신이 후일 것 같아요

select 
    jobID, JobName,
    sum(case when Priority = 1 then 1 else 0 end) as priority1,
    sum(case when Priority = 2 then 1 else 0 end) as priority2,
    sum(case when Priority = 3 then 1 else 0 end) as priority3,
    sum(case when Priority = 4 then 1 else 0 end) as priority4,
    sum(case when Priority = 5 then 1 else 0 end) as priority5
from
    Jobs
group by 
    jobID, JobName

그러나 결과에서 jobID 및 JobName이 필요한지 확실하지 않습니다. 그러면 제거하고 그룹을 제거하십시오.


SUM 대신 COUNT를 사용하면 ELSE 문에 대한 요구 사항이 제거됩니다.

SELECT jobId, jobName,
    COUNT(CASE WHEN Priority=1 THEN 1 END) AS Priority1,
    COUNT(CASE WHEN Priority=2 THEN 1 END) AS Priority2,
    COUNT(CASE WHEN Priority=3 THEN 1 END) AS Priority3,
    COUNT(CASE WHEN Priority=4 THEN 1 END) AS Priority4,
    COUNT(CASE WHEN Priority=5 THEN 1 END) AS Priority5
FROM TableName
GROUP BY jobId, jobName

IIF 표준 SQL 구문은 아니지만 데이터베이스에서 지원하는 경우 동일한 결과를 생성하는보다 우아한 문을 얻을 수 있습니다.

SELECT JobId, JobName,

COUNT(IIF (Priority=1, 1, NULL)) AS Priority1,
COUNT(IIF (Priority=2, 1, NULL)) AS Priority2,
COUNT(IIF (Priority=3, 1, NULL)) AS Priority3,
COUNT(IIF (Priority=4, 1, NULL)) AS Priority4,
COUNT(IIF (Priority=5, 1, NULL)) AS Priority5

FROM TableName
GROUP BY JobId, JobName

ANSI SQL-92 CASE 문을 사용하면 다음과 같은 작업을 수행 할 수 있습니다 (파생 된 테이블과 케이스).

 SELECT jobId, jobName, SUM(Priority1)
 AS Priority1, SUM(Priority2) AS
 Priority2, SUM(Priority3) AS
 Priority3, SUM(Priority4) AS
 Priority4,  SUM(Priority5) AS
 Priority5 FROM (
     SELECT jobId, jobName,
     CASE WHEN Priority = 1 THEN 1 ELSE 0 END AS Priority1,
     CASE WHEN Priority = 2 THEN 1 ELSE 0 END AS Priority2,
     CASE WHEN Priority = 3 THEN 1 ELSE 0 END AS Priority3,
     CASE WHEN Priority = 4 THEN 1 ELSE 0 END AS Priority4,
     CASE WHEN Priority = 5 THEN 1 ELSE 0 END AS Priority5
     FROM TableName


)

SELECT  Priority, COALESCE(cnt, 0)
FROM    (
        SELECT  1 AS Priority
        UNION ALL
        SELECT  2 AS Priority
        UNION ALL
        SELECT  3 AS Priority
        UNION ALL
        SELECT  4 AS Priority
        UNION ALL
        SELECT  5 AS Priority
        ) p
LEFT JOIN
        (
        SELECT  Priority, COUNT(*) AS cnt
        FROM    jobs
        GROUP BY
                Priority
        ) j
ON      j.Priority = p.Priority

테이블 자체에 대해 조인 할 수 있습니다.

select
   t.jobId, t.jobName,
   count(p1.jobId) as Priority1,
   count(p2.jobId) as Priority2,
   count(p3.jobId) as Priority3,
   count(p4.jobId) as Priority4,
   count(p5.jobId) as Priority5
from
   theTable t
   left join theTable p1 on p1.jobId = t.jobId and p1.jobName = t.jobName and p1.Priority = 1
   left join theTable p2 on p2.jobId = t.jobId and p2.jobName = t.jobName and p2.Priority = 2
   left join theTable p3 on p3.jobId = t.jobId and p3.jobName = t.jobName and p3.Priority = 3
   left join theTable p4 on p4.jobId = t.jobId and p4.jobName = t.jobName and p4.Priority = 4
   left join theTable p5 on p5.jobId = t.jobId and p5.jobName = t.jobName and p5.Priority = 5
group by
   t.jobId, t.jobName

또는 합계 내에서 케이스를 사용할 수 있습니다.

select
   jobId, jobName,
   sum(case Priority when 1 then 1 else 0 end) as Priority1,
   sum(case Priority when 2 then 1 else 0 end) as Priority2,
   sum(case Priority when 3 then 1 else 0 end) as Priority3,
   sum(case Priority when 4 then 1 else 0 end) as Priority4,
   sum(case Priority when 5 then 1 else 0 end) as Priority5
from
   theTable
group by
   jobId, jobName

작업 ID, 작업 이름 및 Priority1, Priority2, Priority3, Priority4라는 5 개의 필드를 표시해야합니다. 우선 순위 5.

쿼리 디자인에 문제가 있습니다. 각 행에도 특정 작업이 표시되므로 행에 '0'이있는 4 개의 우선 순위 열과 '1'(해당 작업의 우선 순위)이있는 1 개의 우선 순위 열이있는 상황이 발생합니다. 또는 모든 행의 모든 ​​우선 순위에 대한 카운트를 반복하게됩니다.

여기에 무엇을 보여주고 싶습니까?


이 시도:

SELECT Count(Student_ID) as 'StudentCount' 
FROM CourseSemOne
where Student_ID=3 
Having Count(Student_ID) < 6 and Count(Student_ID) > 0;

참고URL : https://stackoverflow.com/questions/1288058/conditional-count-on-a-field

반응형