>

emp_id와 month_of_project라는 두 개의 열이있는 직원 테이블이 있습니다. 특정 달에 프로젝트에 참여한 직원 수를 확인하고 싶습니다. 같은 사람이 3 개월에 참여한 경우 첫 달 동안 만 그 사람을 계산합니다. 아래에 샘플을 언급했습니다

emp_id       month_of_project
101           Jan
102           Jan
103           Jan
101           Feb
104           Mar
102           Mar
105           Apr
103           Apr

결과는

month    count
Jan     3
Feb     0
Mar     1
Apr     1 

SQL에서 이것을 달성 할 수있는 방법이 있습니까?

  • 답변 # 1

    GROUP BY 절만 사용해야한다고 생각합니다

    SELECT month_of_project, COUNT(emp_id)
    FROM employees
    GROUP BY month_of_project
    
    

  • 답변 # 2

    NOT EXISTS 를 사용할 수 있습니다  이전 달에 레코드가없는 레코드 만 가져옵니다. 숫자가 아니라 해당 월의 텍스트 표현을 선택하는 것이 너무 나쁩니다. 따라서 먼저 숫자로 변환해야합니다. 당신은 CASE 를 사용할 수 있습니다  여기에 표현하십시오.

    SELECT t1.month_of_project,
           count(*)
           FROM elbat t1
           WHERE NOT EXISTS (SELECT *
                                    FROM elbat t2
                                    WHERE CASE t2.month_of_project
                                            WHEN 'Jan' THEN
                                              1
                                            ...
                                            WHEN 'Dec' THEN
                                              12
                                          END
                                          <
                                          CASE t1.month_of_project
                                            WHEN 'Jan' THEN
                                              1
                                            ...
                                            WHEN 'Dec' THEN
                                              12
                                          END
                                          AND t2.emp_id = t1.emp_id)
           GROUP BY t1.month_of_project;
    
    

  • 답변 # 3

    SQL은 오라클 용입니다. 그리고 실제 시스템에 이와 같은 달을 저장하지 마십시오. 날짜 필드를 사용하십시오. 사용 사례가 월인 경우 연도는 2000과 같이 임의 일 수 있으며 일은 01 일 수 있지만 정렬 등을 위해 대기 시간이 항상 항상 올바른 아이디어입니다.

    먼저 데이터를 시뮬레이션하는 것입니다. with part mons의 두 번째는 2 월에 0을 원하기 때문에 가능한 월 목록을 얻는 것입니다. 외부에 테이블이 있으면 필요하지 않습니다.

    기본적으로 내부 쿼리는 직원의 첫 달을 사용할 월로 찾고 외부 쿼리는 구별합니다

    with emp_mon as 
    (
                  select '101' emp_id, to_date('20190101','YYYYMMDD') month_of_project from dual 
        union all select '102', to_date('20190101','YYYYMMDD') from dual 
        union all select '103', to_date('20190101','YYYYMMDD') from dual 
        union all select '101', to_date('20190201','YYYYMMDD') from dual 
        union all select '104', to_date('20190301','YYYYMMDD') from dual 
        union all select '102', to_date('20190301','YYYYMMDD') from dual 
        union all select '105', to_date('20190401','YYYYMMDD') from dual 
        union all select '103', to_date('20190401','YYYYMMDD') from dual 
    ),
    mons as
    (
        select distinct month_of_project
        from  emp_mon
    )
    select mons.month_of_project, count(distinct emp_first_mon.emp_id) cnt_emp_id
    from mons
         left outer join
         (
             select emp_id, min(month_of_project) month_of_project
             from emp_mon
             group by emp_id
         ) emp_first_mon on emp_first_mon.month_of_project = mons.month_of_project
    group by mons.month_of_project
    order by 1
    
    
    

  • 답변 # 4

    SQL Server COUNT DISTINCT는 정확히 원하는 작업을 수행합니다. 그러나 올바른 열을 기준으로 그룹화하는 것이 중요합니다.

    WITH TEMP AS
    (
    SELECT 1 AS EMP, 1 AS MONTH_D
    UNION ALL
    SELECT 2 AS EMP, 1 AS MONTH_D
    UNION ALL
    SELECT 2 AS EMP, 1 AS MONTH_D
    UNION ALL
    SELECT 3 AS EMP, 1 AS MONTH_D
    UNION ALL
    SELECT 1 AS EMP, 2 AS MONTH_D
    )
    SELECT MONTH_D, COUNT(DISTINCT EMP) FROM TEMP
    GROUP BY MONTH_D
    
    

관련 자료

  • 이전 redis - SQS에서 자동 할당 컨텐츠를 디자인하는 방법은 무엇입니까?
  • 다음 javascript - redux에서 작업이 완료된 후 데이터를 가져 오는 방법은 무엇입니까?