0

我正在与我们的人力资源部门合作一个项目。我有一个名为 [EEMaster] 的表,它记录了 Active/Termed 员工的记录。它是使用渐变维度从平面文件更新的。

在年底,我需要计算在职员工的数量和正式员工的数量,然后是年份。

这是我需要每年返回的数据的示例。

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

我目前将数据连接到一个提供分部滚动计数的 Excel 电子表格。我使用 [EEMaster] 中的以下列。

  • ChangeStatus(来自 SCD 的 1/0)
  • EmpStatusName(当前员工为“Active”,离职员工为“Withdrawn”)
  • HireYear(在数据透视表中设置为全部)
  • 学期年(在数据透视表中设置为 2013)
  • PONumb(员工编号,我用于计数)

我创建了一个表格来输入数据,我将手动将前几年(计数)加载到表格中,因为当前的发展是一个滚动数字。我想要做的是开发一个 SSIS 包,它将捕获 2014 年 1 月 1 日的计数,并将“活跃员工”的数量、“任期员工”和刚刚完成的年份插入到表格中。

更新:

我创建了两个查询。一个提供活跃员工数量的

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

3 回答 3

1

您正在寻找一个 case 表达式的语法,它会聚合以添加一些不同的东西。

Sum(Case when (expression) then 1 end)

您还希望按列中出现的年份进行分组,以便您可以轻松地以此为中心。您提到了动态,但我真的不知道您是否需要仅针对年份逻辑而获得更多动态。如果您希望 SQL 语句进入数据流以生成 Excel 工作表的输出,我真的不知道。基本上,如果您只想要一个网格,其中一行是一组条件,另一行是另一组。我会做两个或多个选择的“联合”,只要它不是太大,它不应该那么难。这是一个带有虚拟数据的简单自提取示例,以了解我的意思。

它将在 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
于 2013-07-31T00:05:55.863 回答
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
             );

我想分享一下,以防其他人遇到类似情况。

谢谢大家的意见和指导。

于 2013-08-01T14:25:12.227 回答
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 日运行。

于 2013-07-31T15:30:56.250 回答