복붙노트

[SQL] 필드에 조건부 카운트

SQL

필드에 조건부 카운트

나는이 같은 테이블을 가지고 있다면 :

jobId, jobName, Priority

이로써 우선 순위는 1 ~ 5 사이의 정수가 될 수 있습니다.

나는이 보고서의 차트를 생성하는이 쿼리를해야하기 때문에, 나는 작업 ID, 작업 이름 및 Priority1, Priority2, Priority3, Priority4라는 5 개 필드를 표시해야합니다. Priority5.

Priority1 우선 순위 필드는 1의 값을 갖는 행의 량을 계산한다.

Priority2 우선 순위 필드의 값이 2 행의 량을 계산한다.

Priority3 우선 순위 필드 (3)의 값을 갖는 행의 량을 계산한다.

기타

어떻게 그 빠르고 성능이 좋은 방법으로 할 것인가?

많은 감사, KAVE

해결법

  1. ==============================

    1.난 당신이 후 것 같아요

    난 당신이 후 것 같아요

    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 및 작업 이름을 필요로하는 경우 확실 해요

  2. ==============================

    2.ELSE 문에 대한 요구 사항은 대신 SUM의 COUNT를 제거합니다 사용 :

    ELSE 문에 대한 요구 사항은 대신 SUM의 COUNT를 제거합니다 사용 :

    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
    
  3. ==============================

    3.IIF는 표준 SQL 구문 아니지만, 그것은 당신의 데이터베이스에 의해 지원되는 경우에는, 당신은 동일한 결과를 생성하는 더 우아한 문을 달성 할 수있다 :

    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
    
  4. ==============================

    4.ANSI SQL-92 CASE 문을 사용하여, 당신은이 (파생 ​​테이블 플러스의 경우)와 같은 뭔가를 할 수 :

    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
    
    
    )
    
  5. ==============================

    5.

    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
    
  6. ==============================

    6.당신은 자신에 대해 테이블을 조인 수 :

    당신은 자신에 대해 테이블을 조인 수 :

    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
    
  7. ==============================

    7.쿼리 디자인 뭔가 잘못. 당신은뿐만 아니라 각 행에서 특정 작업을 보여주는하고있어 당신도 혹시 행 (즉, 작업의 우선 순위) '1'과 '0'하나의 우선 순위 열 4 개의 우선 순위 열이 상황을해야하므로 또는 당신은 모든 행의 모든 ​​우선 순위의 수를 반복하게 될 겁니다.

    쿼리 디자인 뭔가 잘못. 당신은뿐만 아니라 각 행에서 특정 작업을 보여주는하고있어 당신도 혹시 행 (즉, 작업의 우선 순위) '1'과 '0'하나의 우선 순위 열 4 개의 우선 순위 열이 상황을해야하므로 또는 당신은 모든 행의 모든 ​​우선 순위의 수를 반복하게 될 겁니다.

    당신은 정말 여기에 표시 할 수 있습니까?

  8. ==============================

    8.이 시도:

    이 시도:

    SELECT Count(Student_ID) as 'StudentCount' 
    FROM CourseSemOne
    where Student_ID=3 
    Having Count(Student_ID) < 6 and Count(Student_ID) > 0;
    
  9. from https://stackoverflow.com/questions/1288058/conditional-count-on-a-field by cc-by-sa and MIT license