Есть ли способ зацикливаться в SQL - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь создать ежемесячный процесс прогнозирования в SQL. Я создал запрос для Яна и хотел выяснить, можно ли циклически проходить каждый дополнительный месяц и сохранять результаты во временной таблице.

Логически я хотел бы установить для переменной @DMonth значение 1, выполнитьзапрос, сохранить / добавить результаты во временную таблицу, цикл ...

установить для переменной @DMonth значение 2, выполнить запрос, сохранить / добавить результаты во временную таблицу, цикл ...

и т. Д. Устанавливая @DMonth последовательно, пока он не достигнет 12, а затем выйдите из цикла.

Пример переменной в запросе:

Declare @DMonth int;
set @DMonth = 1

Я считаю, что мне нужно установить цикл вокругУстановка переменной @DMonth.

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Если вы используете postgresql, это возможно с рекурсивным cte

WITH RECURSIVE dates as (
  SELECT CAST('2018-01-01' AS date) AS month

  UNION ALL

  SELECT CAST(month + interval '1 month' AS date) AS date 
  FROM dates
  WHERE CAST(month + interval '1 month' AS date) < '2019-01-01'      
)

SELECT * FROM dates;

sql fiddle

update:

Вы обновили свой вопрос, и теперь ясно, что вы используете sql server, он также поддерживает cte.

0 голосов
/ 23 октября 2019

Ну, конечно, вы можете зацикливаться в sql. Синтаксис немного отличается, но похож, и вы можете легко понять это, если вы знаете базовое кодирование. Однако мы можем использовать только цикл while в sql. Синтаксис такой, как показано ниже. пока цикл. мы в основном используем

while (n

0 голосов
/ 23 октября 2019

Непонятно, что вы действительно хотите делать внутри цикла, но вот как выполнить цикл и сохранить месяц во временной таблице:

CREATE TABLE #temp(mon int);

Declare @StartDate DATETIME = '2016-09-01',
        @EndDate DATETIME = '2017-01-31'


-- Now you have 12 months and you can use below query to loop through each month starting from January 

WHILE (@StartDate <= @EndDate)
BEGIN
    DECLARE @Month INT = Month(@StartDate) -- At the start of loop @Month is equal to 9 

    -- Save @Month to temp table in each repeat 
    INSERT INTO #temp (mon)
    SELECT @Month;

    SET @StartDate = DATEADD(MONTH, 1, @StartDate); -- this line adds 1 value to @Month after first loop @Month will be 10 
END

Если вы хотите запустить цикл с @StartDate (сентябрь 2016 г.), а затем завершите его @EndDate (январь 2017 г.). Приведенный выше запрос выполняет точно такой же процесс. Но если вы хотите изменить @StartDate на 2016-01-01 и @EndDate на 2016-12-31, используйте следующий запрос:

CREATE TABLE #temp(mon int);

Declare @StartDate DATETIME = DATEADD(MONTH, -8, '2016-09-01'); -- It will set @StartDate to '2016-01-01' 
Declare @EndDate DATETIME = DATEADD(MONTH, 11, DATEADD(YEAR, -1, '2017-01-31')); -- It will set @EndDate to '2016-12-31'

-- Now you have 12 months and you can use below query to loop through each month starting from January 

WHILE (@StartDate <= @EndDate)
BEGIN
    DECLARE @Month INT = Month(@StartDate) -- At the begining @Month is equal to 1 

    -- Save @Month to temp table in each repeat 
    INSERT INTO #temp (mon)
    SELECT @Month;

    SET @StartDate = DATEADD(MONTH, 1, @StartDate); -- this line adds 1 value to @Month after first loop @Month will be 2 
END
...