SQL Server: получение данных за последние 7 месяцев для столбца месяца, который содержит только целые числа 1-12? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть набор данных в Alteryx, который помещает годы и месяцы в разные столбцы целых чисел (например, месяцы: 1-12 и годы: 2018), и я был в состоянии динамически выбирать последний год, но не могу понять, как динамически получать только последние 7 месяцев данных. Я знаю, что мог бы объединить месяц и год и преобразовать их в формат datetime для использования DATEADD (), однако остальная часть моего рабочего процесса зависит от того, являются ли они отдельными. Есть ли способ сделать это с помощью SQL или Alteryx?

EX:
current_month = 2, поэтому он должен возвращать, где sales_month = 1, 12, 11, 10, 9, 8, 7

или

current_month = 12, поэтому он должен возвращаться, где sales_month = 11, 10, 9, 8, 7, 6, 5

Любое руководство было бы полезно, пробовали МНОГИЕ различные потенциальные решения. Спасибо!

Ответы [ 4 ]

0 голосов
/ 07 марта 2019

Вы можете создать DATE в своем предложении WHERE, используя DATEFROMPARTS, а затем добавить дополнительную переменную для даты сравнения, чтобы избежать повторного ввода ее в предложении WHERE.

DECLARE @current_month INT = 1
       ,@current_year INT = 2019

DECLARE @compDate DATE = DATEFROMPARTS(@current_year,@current_month,DAY(GETDATE()))

SELECT
 *
FROM @t
WHERE 
 DATEFROMPARTS(current_year,current_month,DAY(GETDATE())) >= DATEADD(MONTH, -7, @compDate)
 AND
 DATEFROMPARTS(current_year,current_month,DAY(GETDATE())) < @compDate

Результаты:

+---------------+--------------+
| current_month | current_year |
+---------------+--------------+
|             6 |         2018 |
|             7 |         2018 |
|             8 |         2018 |
|             9 |         2018 |
|            10 |         2018 |
|            11 |         2018 |
|            12 |         2018 |
+---------------+--------------+

Вот таблица, настроенная для тестирования:

DECLARE @t TABLE
(
  current_month INT NOT NULL,
  current_year INT NOT NULL
);

INSERT @t
  (
    current_month
   ,current_year
  )
VALUES
  (1, 2018),
  (2, 2018),
  (3, 2018),
  (4, 2018),
  (5, 2018),
  (6, 2018),
  (7, 2018),
  (8, 2018),
  (9, 2018),
  (10, 2018),
  (11, 2018),
  (12, 2018),
  (1, 2019),
  (2, 2019),
  (3, 2019);
0 голосов
/ 07 марта 2019

Ну, вы можете сделать сравнение следующим образом:

where (@current_month >= 7 and sales_month > @current_month - 7) or
      (@current_month < 7 and
       (sales_month > 0 or
        sales_month > 12 - (@current_month - 7)
      )
0 голосов
/ 07 марта 2019

Для этого можно использовать DATEFROMPARTS или DATETIMEFROMPARTS.

SELECT DISTINCT sales_month
FROM your_table
WHERE DATEFROMPARTS(sales_year,sales_month,1) BETWEEN DATEADD(MONTH,-8,CURRENT_TIMESTAMP) AND DATEADD(MONTH,-1,CURRENT_TIMESTAMP)
0 голосов
/ 07 марта 2019

попробуйте как показано ниже для получения номера за последние 7 месяцев

  SELECT  MONTH(DATEADD(mm, -m, GETDATE())) AS m,
            LEFT(DATENAME(mm,  DATEADD(mm, -m, GETDATE())), 3) AS n,
            YEAR(DATEADD(mm, -m, GETDATE())) AS y
    FROM    (VALUES (0),(1),(2),(3),(4),(5),(6),(7)) t(m)


m   name    y
3   Mar 2019
2   Feb 2019
1   Jan 2019
12  Dec 2018
11  Nov 2018
10  Oct 2018
9   Sep 2018
8   Aug 2018

используйте этот вывод как CTE и присоединитесь к вашей таблице, чтобы вернуться за последние 7 месяцев

...