Ежемесячная численность с выпускниками - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь сделать что-то похожее на эту тему Как получить количество сотрудников в год

Разница в том, что мне нужно количество сотрудников по месяцам, а также вычислить количество выпускников.

Я немного изменил запрос, чтобы вместо [год] я получил [год-месяц]. Поэтому я конвертирую дату в строку и извлекаю первые 6 символов (ГГГГММ) и преобразую ее в целое число.

DECLARE @FromYear int, @ToYear int

SELECT @FromYear = 201801,
       @ToYear = convert(int,LEFT(CONVERT(char,GETDATE(),112),6))
FROM [Airconnect].[dbo].[CoreNZ]

;WITH CTE AS 
(
    SELECT @FromYear As TheYear
    UNION ALL
    SELECT TheYear + 1
    FROM CTE
    WHERE TheYear < @ToYear
)

SELECT TheYear as [Year], 
       COUNT
       (
       CASE WHEN TheYear <= convert(int,LEFT(CONVERT(char,COALESCE([Staff_End_Date], GETDATE()),112),6)) THEN 
           1 
       END
       ) As [No. of Employees.]
FROM CTE
INNER JOIN [dbo].[CoreNZ] ON(TheYear >= convert(int,LEFT(CONVERT(char,Start_Date,112),6)))
GROUP BY TheYear

Я получаю следующее сообщение:

Сообщение 530, уровень 16, состояние 1, строка 8 Заявление прекращено. Максимальная рекурсия 100 была исчерпана до завершения оператора.

1 Ответ

1 голос
/ 28 июня 2019

Поскольку ваша рекурсия года превышает предел рекурсии, ограничения CTE (по умолчанию 100). Вы можете изменить этот лимит, добавив параметр MAXRECURSION.

OPTION (MAXRECURSION 500) 

Вы можете добавить эту опцию в конец вашего запроса.

DECLARE @FromYear int, @ToYear int

SELECT @FromYear = 201801,
       @ToYear = convert(int,LEFT(CONVERT(char,GETDATE(),112),6))
FROM [Airconnect].[dbo].[CoreNZ]

;WITH CTE AS 
(
    SELECT @FromYear As TheYear
    UNION ALL
    SELECT TheYear + 1
    FROM CTE
    WHERE TheYear < @ToYear
)

SELECT TheYear as [Year], 
       COUNT
       (
       CASE WHEN TheYear <= convert(int,LEFT(CONVERT(char,COALESCE([Staff_End_Date], GETDATE()),112),6)) THEN 
           1 
       END
       ) As [No. of Employees.]
FROM CTE
INNER JOIN [dbo].[CoreNZ] ON(TheYear >= convert(int,LEFT(CONVERT(char,Start_Date,112),6)))
GROUP BY TheYear
OPTION (MAXRECURSION 500)

Дополнительная, если вам нужны только год и месяцы, я думаю, что эта версия запроса намного лучше.

DECLARE @FromYear DATE, @ToYear DATE

SELECT @FromYear = '20180101',
       @ToYear = CAST(GETDATE() AS DATE)
FROM [Airconnect].[dbo].[CoreNZ]

;WITH CTE AS 
(
    SELECT @FromYear As TheYear
    UNION ALL
    SELECT DATEADD(MONTH,1,TheYear)
    FROM CTE
    WHERE TheYear < @ToYear
)

SELECT TheYear as [Year], 
       COUNT
       (
       CASE WHEN TheYear <= COALESCE([Staff_End_Date], GETDATE()) THEN 
           1 
       END
       ) As [No. of Employees.]
FROM CTE
INNER JOIN [dbo].[CoreNZ] ON(TheYear >= Start_Date)
GROUP BY TheYear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...