我在Alteryx中有一个数据集,该数据集将数年和几个月的整数列(例如月份:1-12 and Years: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
任何指导都会有所帮助,尝试了许多不同的潜在解决方案。谢谢!
尝试下面的最后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个月
好吧,您可以进行类似的比较:
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)
)
您可以使用DATEFROMPARTS
在WHERE
子句中构建DATE
,然后将其扔进一个额外的变量以进行比较日期,只是为了避免在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);
您可以使用 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)