2013-07-30 4 views
0

저는 HR 부서의 프로젝트를 진행하고 있습니다. 나는 [EEMaster]라는 테이블을 가지고 있으며, Active/Termed 직원의 기록을 유지합니다. 느리게 변경되는 치수를 사용하여 플랫 파일에서 업데이트됩니다.연간 수 기준 기준

연말에 액티브 직원 수와 정규 직원 수 그리고 그 다음 연도가 필요합니다.

다음은 매년 반환해야하는 데이터의 예입니다.

   | 2010 | 2011 | 2012 | 2013 | 
HistoricalHC | 447 | 419 | 420 | 418 | 
NumbTermEmp | 57 | 67 | 51 | 42 | 

I는 현재 분할하여 회전 수를 제공 Excel 스프레드 시트에 접속 된 데이터를 가지고있다. [EEMaster]에서 다음 열을 사용합니다.

  • ChangeStatus합니다 (SCD에서 1/0)
  • EmpStatusName (현재 직원은 "활성"와 불리는 직원은 "철회") (피벗 테이블에 모두로 설정)
  • HireYear을
  • 용어 해
  • PONumb (직원 번호, I는 카운트 사용)

은 I 입력에, I는 줘야에 데이터를 테이블을 작성한 (피벗 테이블 2013로 설정) 현재 개발이 롤링 번호이므로 수동으로 이전 연도 (수)를 테이블에로드합니다. 내가 원하는 것은 2014 년 1 월 1 일에 계산을 캡처하고 방금 완료 한 "활성 직원", "지정된 직원"및 연도를 삽입하는 SSIS 패키지를 개발하는 것입니다.

업데이트 : 두 개의 쿼리를 만든

. 활성 종업원

SELECT COUNT([PersNo]) AS HistoricalHC 
FROM [dbo].[EEMaster] 
WHERE [ChangeStatus] = 'Current' AND [EmpStatusName] = 'Active' 

|HistoricHC| 
|418  | 

반환 및 기간 연도 별 용어의 수를 제공하는 또 다른

SELECT COUNT([PersNo]) AS NumbOfTermEE 
FROM [dbo].[EEMaster] 
WHERE [ChangeStatus] = 'Current' AND [EmpStatusName] = 'Withdrawn' 
AND [TermYear] = '2013' 

|NumbOfTermEE| 
|42   | 
를 반환의 수를 제공 한

[TermYear]가 필요합니다. 동적 인 것. 이후 매년 1 월 1 일에 실행됩니다. 전년도의 용어 수를 늘릴 필요가 있습니다 (계속적으로).

그런 다음 데이터를 계산 한 연도와 함께 새 행에이 숫자를 모두 추가해야합니다.

|Year|HistoricalHC|NumbOfTermEmp| 
|2010|447   |57   | 
|2011|419   |67   | 
|2012|420   |51   | 
|2013|418   |42   | 
+0

감사합니다. –

답변

1

집계를 수행하는 사례 식의 구문을 찾고 있습니다. 다른 식으로 몇 가지를 추가하십시오. 당신은 쉽게 피벗이에 할 수 있도록 또한 올해로 그룹화 할

Sum(Case when (expression) then 1 end) 

그것은 열에 보인다. 당신은 역동적 인 언급하지만, 당신은 단지 일년 논리에 대한 많은 역동적 인 필요가 있는지 정말 모르겠다. 엑셀 시트의 출력을 생성하기 위해 SQL 문을 데이터 흐름으로 보내고 싶다면 실제로 얻지 못합니다.기본적으로 하나의 행이 하나의 조건 세트이고 다른 하나가 다른 것 인 격자 만 있으면됩니다. 나는 그것이 너무 커서는 안되는만큼 두 개 또는 그 이상의 선택을하는 '노조'를 할 것입니다. 그렇게 열심히해서는 안됩니다. 다음은 더미 데이터가 포함 된 간단한 자체 추출 예제입니다.

SQL Management Studio 2005 이상 버전에서 실행됩니다.

declare @Person Table (personID int identity, person varchar(8)); 

insert into @Person values ('Brett'),('Sean'),('Chad'),('Michael'),('Ray'),('Erik'),('Queyn'); 

declare @Orders table (OrderID int identity, PersonID int, OrderCnt int, dt Date); 

insert into @Orders values (1, 10, '1-7-11'),(1, 12, '2-12-12'),(2, 20, '7-1-13'),(2, 12, '1-5-10'),(3, 20, '6-4-11') 
,(3, 12, '2-3-10'),(3, 6, '6-10-10'),(4, 20, '7-10-11'),(5, 20, '1-8-10'),(5, 9, '2-10-11'), 
(6, 20, '3-1-11'),(6, 34, '4-6-12'),(7, 20, '5-1-11'),(7, 12, '6-8-12'),(7, 56, '7-25-13') 

-- As is just joining sets 
select * 
from @Person p 
    join @Orders o on p.personID = o.PersonID 
order by dt 

-- Years on the rows 
select 
    year(o.dt) as Year 
, sum(o.OrderCnt) as Orders 
, count(p.personID) as People 
, count(distinct p.personID) as DistinctPeople 
from @Person p 
    join @Orders o on p.personID = o.PersonID 
group by year(o.dt) 

-- Custom grouping on rows and doing the years with pivots for the columns 
Select 
    'BulkOrders' as Description 
, sum(case when year(o.dt) = '2010' then OrderCnt end) as [2010Orders] 
, sum(case when year(o.dt) = '2011' then OrderCnt end) as [2011Orders] 
, sum(case when year(o.dt) = '2012' then OrderCnt end) as [2012Orders] 
, sum(case when year(o.dt) = '2013' then OrderCnt end) as [2013Orders] 
, sum(OrderCnt) as Totals 
from @Person p 
    join @Orders o on p.personID = o.PersonID 
union 
select 
    'OrdersByPerson' 
, Count(case when year(o.dt) = '2010' then p.personID end) 
, Count(case when year(o.dt) = '2011' then p.personID end) 
, Count(case when year(o.dt) = '2012' then p.personID end) 
, Count(case when year(o.dt) = '2013' then p.personID end) 
, Count(p.personID) 
from @Person p 
    join @Orders o on p.personID = o.PersonID 
union 
select 
    'OrdersByPersonDistinct' 
, Count(distinct case when year(o.dt) = '2010' then p.personID end) 
, Count(distinct case when year(o.dt) = '2011' then p.personID end) 
, Count(distinct case when year(o.dt) = '2012' then p.personID end) 
, Count(distinct case when year(o.dt) = '2013' then p.personID end) 
, Count(distinct p.personID) 
from @Person p 
    join @Orders o on p.personID = o.PersonID 
+0

정보를 제공해 주셔서 감사합니다. 고객이 원하는 것에 대한 통찰력을 줄 수 있습니다. 우리는 Excel 시스템의 SAP 시스템에서 가져온 HR 데이터를 Excel 파일 형식으로 보유하고 있습니다. 매월 파일에서 해당 데이터를 캡처하고 SCD2를 사용하여 테이블을 업데이트하는 SSIS 패키지를 만들었습니다. 그런 다음 Excel (고객 요청 당)을 사용하여 데이터를 일련의 피벗 테이블로 가져옵니다. 차트와 계산을 통해 하나의 큰 테이블을 본질적으로 몇 개의 작은 보고서로 나눕니다. 이것에 대한 마지막 구성 요소는 전체 직원 수를 yrs 종단 기간의 전반적인 수와 비교하는 것입니다. –

+0

BTW, 훌륭한 예입니다. 나는 실제로 다른 프로젝트에서 이것을 사용할 수 있습니다. 다시 감사합니다. –

+1

문제는 없지만 SSIS는 확실히 원하는대로 할 수있는 메커니즘입니다. SSIS는 데이터베이스에 플랫 파일을 가져 와서 조작 한 다음 다시 제공하는 데 적합합니다. – djangojazz

0

여기 나와있는 해결책이 있습니다.

다음 저장 프로 시저를 실행할 SSIS 패키지를 만듭니다.

INSERT INTO [dbo].[TORateFY] (Year,HistoricalHC,NumbTermedEmp) 
    SELECT DISTINCT YEAR(GETDATE()) AS [Year], 
     SUM(CASE WHEN EmpStatusName = 'Active' THEN 1 ELSE 0 END) AS HistoricalHC, 
     SUM(CASE WHEN EmpStatusName = 'Withdrawn' AND TermYear = YEAR(GETDATE()) THEN 1 ELSE 0 END) AS NumbOfTermEE 
    FROM dbo.EEMaster 

은 내 이전 대답 12월

의 31
0

업데이트에 매년 실행되도록 예약됩니다

내가 다른 포럼에 사람과 협력하고 그가 훌륭한 스크립트를 제공하는 것 전체 직원 수를 얻기 위해 연말까지 기다리지 말고 월별로 활동중인 직원과 임직원 모두에게 정확한 수를 제공하십시오. 이렇게하면 보고서가 원래 수동으로 수행 된 것과 더 많은 인라인으로 배치됩니다.

MERGE dbo.TORateFY AS tgt 
USING (
    SELECT DATENAME(YEAR, GETDATE()) AS [Year], 
    SUM(CASE WHEN EmpStatusName = 'Active' THEN 1 ELSE 0 END) AS HistoricalHC, 
    SUM(CASE WHEN EmpStatusName = 'Withdrawn' AND TermYear = DATENAME(YEAR, 
    GETDATE()) THEN 1 ELSE 0 END) AS NumbOfTermEE 
    FROM dbo.EEMaster 
    WHERE ChangeStatus = 'Current' 
    AND EmpStatusName IN ('Active', 'Withdrawn') 
    OR TermYear <= DATENAME(YEAR, GETDATE()) 
) AS src ON src.[Year] = tgt.[Year] 
WHEN MATCHED 
    THEN UPDATE 
    SET tgt.HistoricalHC = src.HistoricalHC, 
     tgt.NumbTermedEmp = src.NumbOfTermEE 
WHEN NOT MATCHED BY TARGET 
THEN INSERT (
      [Year], 
      HistoricalHC, 
      NumbTermedEmp 
      ) 
VALUES (
     src.[Year], 
     src.HistoricalHC, 
     src.NumbOfTermEE 
      ); 

다른 누구도 비슷한 상황에 처했을 때를 대비하고 싶었습니다.

귀하의 의견과 안내에 대해 모두에게 감사드립니다.