簡體   English   中英

T-SQL:根據一年中的月數找到平均的雇員數

[英]T-SQL : find the employee count as average by the number of months in the year

我有名為Employee表,這些列:

Id (identity)
EmploymentStartDate (datetime),
EmploymentEndDate (nullable datetime),

我的查詢:

DECLARE @FromYear int = 2010, @ToYear int = 2017;

WITH YEARS AS 
(
    SELECT @FromYear As TheYear
    UNION ALL
    SELECT TheYear + 1
    FROM YEARS
    WHERE TheYear < @ToYear
)
SELECT
    Y.TheYear,
    SUM(CASE 
           WHEN YEAR(EmploymentStartDate) <= Y.TheYear
                AND (EmploymentEndDate IS NULL OR YEAR(EmploymentEndDate) >= Y.TheYear)
              THEN 1
              ELSE 0
        END) WorkingEmployeeCount,
    SUM(CASE 
           WHEN YEAR(EmploymentStartDate) = Y.TheYear
              THEN 1
              ELSE 0
        END) StartedEmployeeCount,
    SUM(CASE 
           WHEN YEAR(EmploymentEndDate) = Y.TheYear
              THEN 1
              ELSE 0
        END) SeparatedEmployeeCount
FROM
    YEARS Y
CROSS JOIN
    Employees E
GROUP BY
    Y.TheYear

當我運行此查詢時,我得到以下結果:

TheYear - WorkingEmployeeCount - StartedEmployeeCount - SeparatedEmployeeCount
---------------------------------------------------------------    
2010    -  1                   -  1                   -   0
2011    -  2                   -  1                   -   0
2012    -  2                   -  0                   -   0
2013    -  2                   -  0                   -   0
2014    -  2                   -  0                   -   0
2015    -  4                   -  2                   -   1
2016    -  3                   -  0                   -   0
2017    -  6                   -  3                   -   2

題:

我需要使用以下公式。 首先,我想查找每年的月份計數,然后是每年的EmployeeCount的AVG。

EmployeeCount / MonthsCountPerYear then get AVG

如果我在下面嘗試查詢,那么它對我不起作用(我無法創建解決方案)

(AVG(EmployeeCount / (CASE WHEN TheYear = DATE(GETUTCDATE) THAN 2 ELSE 12 END))) AS AvgEmployeeCount

我想要的應該是如下

TheYear - WorkingEmployeeCount - StartedEmployeeCount -SeperatedEmployeeCount - AvgEmployeeCount

2010    -  1                   -  1                   -   0                      - 1,30
2011    -  2                   -  1                   -   0                      - 1,20
2012    -  2                   -  0                   -   0                      - 1,00
2013    -  2                   -  0                   -   0                      - 3,50
2014    -  2                   -  0                   -   0                      - 5,33
2015    -  4                   -  2                   -   1                      - 7-33
2016    -  3                   -  0                   -   0                      - 9-34
2017    -  6                   -  3                   -   2                      - 1,15

我如何才能找到每年根據一年中的月份計算的員工平均數? 任何幫助將不勝感激。 謝謝

解:

  DECLARE @MONTH INT = -100

                    DECLARE @ENDDATE DATE = CAST(GETUTCDATE() AS DATE)
                    DECLARE @STARTDATE DATETIME = DATEADD(M, @MONTH, @ENDDATE);

                    WITH CALENDAR AS
                    (
                        SELECT @STARTDATE F, YEAR(@STARTDATE) Y, MONTH(@STARTDATE) M
                        UNION ALL
                        SELECT DATEADD(MONTH, 1, F), YEAR(DATEADD(MONTH, 1, F)), MONTH(DATEADD(MONTH, 1, F))
                        FROM CALENDAR
                        WHERE DATEADD(MONTH, 1, F) <= @ENDDATE   
                    )

                    SELECT

                        X.Y AS 'Year',
                        COUN

T(X.Y) AS 'MonthCountInYear',
                        CAST(AVG(X.EmployeeCount) AS DECIMAL(18,2)) AS AvgEmployeeCount,
                        SUM(X.StartedEmployeeCount) AS StartedEmployeeCount,
                        SUM(X.EndedEmployeeCount) AS EndedEmployeeCount,
                        CASE WHEN AVG(X.EmployeeCount) != 0 THEN SUM(X.EndedEmployeeCount) / AVG(X.EmployeeCount) ELSE 0.0 END AS ConversionRate

                    FROM
                    (

                        SELECT
                            C.Y,
                            C.M,
                            SUM
                            (
                                CASE WHEN
                                    (YEAR(EmploymentStartDate) < C.Y OR (YEAR(EmploymentStartDate) = C.Y AND MONTH(EmploymentStartDate) <= C.M))
                                    AND (EmploymentEndDate IS NULL OR (YEAR(EmploymentEndDate) > C.Y OR (YEAR(EmploymentEndDate) = C.Y AND MONTH(EmploymentEndDate) >= C.M)))
                                THEN 1.0
                                ELSE 0.0
                                END
                            ) EmployeeCount,
                            SUM
                            (
                                CASE WHEN
                                    YEAR(EmploymentStartDate) = C.Y AND MONTH(EmploymentStartDate) = 

C.M
                            THEN 1
                            ELSE 0
                            END
                        ) StartedEmployeeCount,
                        SUM
                        (
                            CASE WHEN
                                YEAR(EmploymentEndDate) = C.Y AND MONTH(EmploymentEndDate) = C.M
                            THEN 1
                            ELSE 0
                            END
                        ) EndedEmployeeCount

                    FROM
                        CALENDAR C
                        CROSS JOIN
                        Employees E

                    WHERE
                        IsDeleted = 0 AND EmploymentStartDate IS NOT NULL

                    GROUP BY
                        C.Y, C.M
                ) X
                GROUP BY
                    X.Y

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM