0

データベースに契約のある従業員がいます。従業員がその場所の新入社員かどうかを知りたいです。私は次のデータ構造を持っています:

EmployeeId   Index    BeginDate    Enddate      HoursToWork   LocationId
12133         1       2013-01-01   2014-01-01    10            1
12133         2       2013-06-01   2014-01-01    20            1
12133         3       2012-01-01   2014-01-01    5             1

ご覧のとおり、従業員は 1 つの場所で複数の契約を持つことができます。その後、Endate を null にすることができます。

場所ごと、および月または四半期ごとに、何人の従業員が開始されたかを確認したいと考えています。データを取得したい期間に @Startdate および @Enddate パラメータを使用したい。

私が考慮に入れなければならない多くのケースがあります。同様に、Index = 3 でわかるように、Index フィールドは Begindate と一緒に常に増加するわけではありません。

例:

2013 年 1 月に入社した従業員数を知りたいです。

この場合、最初の契約は 2012 年 1 月 1 日に開始されたため、何もありません。2 つの新しい契約がありますが、この従業員はその場所にとって新しいものではありません。しかし、インデックス 3 が存在しない場合、whis は新しい従業員である必要があります。

従業員が同じ日に開始する 2 つの契約を持っている可能性があります。契約前に契約を結んでいない場合は、1 人の新しい従業員です。

私はすでに次のことを試しました。これは、従業員が1つの契約しか持っていない場合に機能します。しかし、複数の契約がある場合、従業員が新人かどうかを判断するのは困難です。

declare @Startdate datetime set @Startdate = '2013-01-01'
declare @Enddate datetime set @Enddate = '2013-12-31'

select EmployeeId, Index, BeginDate, Enddate, HoursToWork, LocationId
 ,(case
      when BeginDate between @Startdate and @Enddate then 1
 end) as NewEmployee
 ,(case
      when Enddate between @Startdate and @Enddate then 1
 end) as LeavingEmployee

 from Contracts

3 つのレコードを考えると、この従業員は新入社員ではありません。次のような出力が必要です。

LocationId  NewEmployee
   1            0

最初の 2 つのレコードがあり、2013 年 1 月の新入社員を知りたい場合、次のことを期待します。

LocationId  NewEmployee
   1            1
4

1 に答える 1

1

新入社員にこんなのはいかが?

SELECT EmployeeID, LocationID, Min(StartDate) 
  FROM Contracts
GROUP BY EmployeeID, LocationID
HAVING Min(StartDate) between @Startdate and @Enddate

Leavingemployee についても同様のことを提案しますが、それらを 1 つのクエリにまとめようとして多くの労力を費やすつもりはありません。機能的に違うようです。

編集:es、最大ではなく最小にする必要があります。何が必要かというと、「何人の従業員が入社したかを知りたい」と読んだのですが、問題を複雑にする理由はあまり見当たりませんでした。追加のデータが必要な場合は、これをサブクエリに移動してサブクエリで * where ... を選択することはいつでも可能ですが、必要ない場合は ...

アクティブなコントラクト (クエリの時間間隔中にアクティブなコントラクト) のみを処理するために、次のルールを設定できます。> パラメータ開始日。

それをクエリに追加すると、

SELECT EmployeeID, LocationID, Min(StartDate) 
  FROM Contracts
 WHERE Startdate <= @Enddate
   AND Enddate >= @Startdate
GROUP BY EmployeeID, LocationID
HAVING Min(StartDate) between @Startdate and @Enddate
于 2013-11-15T08:06:52.463 に答える