1

従業員の在職期間を毎年取得するために、次のクエリを作成しました。

すなわち。「1 年未満」、「1 ~ 2 年」、「2 ~ 3 年」、「3 年以上」に分類されます。

これを取得するために、employee staffed と比較しますend_date

しかし、 staffed と比較すると正しい結果が得られませんend_date

以下に完全なコードを貼り付けましたが、取得しているカウントが正しくありません。

勤続年数が2年以上の従業員の中には、1年未満の欄に該当するものがあります。

    DECLARE @Project_Id Varchar(10)='ITS-004275';

With Cte_Dates(Period,End_date,Start_date,Project_Id)
As
(
SELECT '<1 Year' AS Period, GETDATE() AS End_Date,DATEADD(YY,-1,GETDATE()) AS Start_date,@Project_Id AS Project_Id
UNION
SELECT '1-2 Years', DATEADD(YY,-1,GETDATE()),DATEADD(YY,-2,GETDATE()),@Project_Id
UNION
SELECT '2-3 Years', DATEADD(YY,-2,GETDATE()),DATEADD(YY,-3,GETDATE()),@Project_Id
UNION
SELECT '>3 Years', DATEADD(YY,-3,GETDATE()),'',@Project_Id
),

--select * from Cte_Dates
--ORDER BY Start_date DESC


Cte_Staffing(PROJECT_ID,EMP_ID,END_DATE) AS
(
SELECT FK_Project_ID,EMP_ID,MAX(End_Date)AS END_DATE FROM DP_Project_Staffing
WHERE FK_Project_ID=@Project_Id
GROUP BY FK_Project_ID,Emp_ID
)



SELECT D.PROJECT_ID,D.Start_date,D.End_date,COUNT(S.EMP_ID) AS Count,D.Period
FROM Cte_Staffing S
RIGHT JOIN Cte_Dates D
ON D.Project_Id=S.PROJECT_ID
AND S.END_DATE<D.End_date AND S.END_DATE>D.Start_date
GROUP BY D.PROJECT_ID,D.Start_date,D.End_date,D.Period
4

4 に答える 4

0

あなたのクエリロジックは少し面倒です。すべての従業員の合計期間を計算して、CASE 句を使用してみませんか? DP_Project_Staffing テーブル構造を教えていただければ、コードの作成をお手伝いできます。begin_date フィールドはありますか?

于 2013-06-26T08:03:33.517 に答える
0
SELECT FK_Project_ID,E.Emp_ID,MIN(Start_Date) AS Emp_Start_Date ,MAX(End_Date) AS Emp_End_Date,
    E.Competency,E.First_Name+' '+E.Last_Name+' ('+E.Emp_Id+')' as Name,'Period'=
        CASE 
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))<=12 THEN '<1 Year'
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))>12 AND DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))<=24 THEN '1-2 Years'
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))>24 AND DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))<=36 THEN '2-3 Years'
            WHEN DATEDIFF(MONTH,MIN(Start_Date),MAX(End_Date))>36 THEN '>3 Years'
        ELSE 'NA'
        END  
    FROM DP_Project_Staffing PS
    LEFT OUTER JOIN DP_Ext_Emp_Master E 
        ON E.Emp_Id=PS.Emp_ID
    WHERE FK_Project_ID=@PROJ_ID
    GROUP BY FK_Project_ID,E.Emp_ID,E.Competency,First_Name,Last_Name
于 2013-06-26T09:47:45.400 に答える
0

これで問題が解決すると思います

ご覧のとおり、次のように使用する必要があります。

DATEADD(year, -1, GETDATE())

GETDATE()また、パラメーターを取得する必要があります

于 2013-06-26T05:48:36.867 に答える
0

あなたはMAX(End_date)CTE の人員配置表を取っています。その場合、従業員が複数のエントリを持っている場合、最新のもののみが適用されます。MIN代わりに使用したい。

このような:

Cte_Staffing(PROJECT_ID,EMP_ID,END_DATE) AS
(
SELECT FK_Project_ID, EMP_ID, MIN(End_Date)AS END_DATE 
  FROM DP_Project_Staffing
...

あなたの質問を読み直すと、おそらくend_date在職期間の計算のための人員配置は必要ありません。を使用したいと思いますstart_date。(または、列が で呼び出されているものは何でもDP_Project_Staffing)

WHEREまた、 /JOIN句を一方の側に含めるように変更するので、次のいずれかになります。

AND S.END_DATE <= D.End_date AND S.END_DATE > D.Start_date

また

AND S.END_DATE < D.End_date AND S.END_DATE >= D.Start_date

日付比較でミリ秒を使用しているため、この場合は違いはありません。ただし、粒度を日付のみに変更すると、従業員がちょうど 1 年前、2 年前などに入社したすべてのレコードが失われます。

于 2013-06-26T08:15:09.030 に答える